search
HomeBackend DevelopmentPHP Tutorial[PHP source code reading] explode and implode functions, explodeimplode_PHP tutorial

[PHP source code reading] explode and implode functions, explodeimplode

explode and implode functions are mainly used for conversion operations between strings and arrays, such as obtaining a parameter and then according to a certain Character splits the string, or combines the result of an array into a string output using one character. These two functions are often used in PHP, so it is necessary to understand their principles.

explode

<p>array explode ( string $delimiter, string $string, [ , $limit ] )</p>

The function returns an array composed of strings. Each element is a substring of string, separated by the string $delimiter as a boundary point.

Parameter description

limit

If $limit is set and is a positive number, the returned array contains at most $limit elements, and the last element will contain the remainder of $string.

If $limit is a negative number, return all elements except the last -$limit elements.

If $limit is 0, it will be treated as 1.

delimiter

If $delimiter is empty, the function returns FALSE. If delimiter is not in string and $limit is a negative number, an empty array is returned.

Run the example

<span>$str</span> = 'hello,world,heiheihei,php';

Let’s first look at the situation without setting a limit

<span>$arr</span> = <span>explode</span>(',', <span>$str</span><span>);
</span><span>print_r</span>(<span>$arr</span>);

When limit is a positive number, limit is set to 1, and a maximum of 1 element is returned.

<span>$arr</span> = <span>explode</span>(',', <span>$str</span>, 1<span>);
</span><span>print_r</span>(<span>$arr</span>);

limit is a negative number, limit is -1, and all elements except the last element are returned.

<span>$arr</span> = <span>explode</span>(',', <span>$str</span>, -1<span>);
</span><span>print_r</span>(<span>$arr</span>);

limit is 0 and is treated as 1.

<span>$arr</span> = <span>explode</span>(',', <span>$str</span>, 0<span>);
</span><span>print_r</span>(<span>$arr</span>);

explode execution steps

<p>1、接收参数,处理参数为空的情况</p>
<p>2、创建函数中使用的局部变量</p>
<p>3、根据limit的值调用不同的函数分隔字符串</p>

The core implementation of the explode function is the php_explode function. The following is the execution flow chart of this function:

[PHP source code reading] explode and implode functions, explodeimplode_PHP tutorial if (p2 == NULL) { // If the separator is not found, the entire string is returned directly add_next_index_stringl(return_value, p1, Z_STRLEN_P(str), 1); } else { do { // Add p1 to the return_value array add_next_index_stringl(return_value, p1, p2 - p1, 1); p1 = p2 Z_STRLEN_P(delim); } while ((p2 = php_memnstr(p1, Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp)) != NULL && --limit > 1); // Add the last value to return_value if (p1 endp) add_next_index_stringl(return_value, p1, endp-p1, 1); }

Source code interpretation

sizeof("") == 0. sizeof has two uses, sizeof(typename) and sizeof(expression). When the parameter is typename, that is, the type name, sizeof returns the size of the object corresponding to the type; when the parameter is expression expression, sizeof calculates the size of the object corresponding to the return type of the expression. Here, "" is an expression. sizeof calculates the space allocated to "" by the compiler during compilation. At this time, it must be included

If limit is not set, the default value of limit is

LONG_MAX. In the php.h file, LONG_MAX is defined as 2147483647L.

In the implementation, if the limit is greater than 1, the

php_explode function is called; if the limit is less than 0, the php_explode_negative_limit function is called; if the limit is equal to 0, it is treated as 1. At this time, call the add_index_stringl function to add str to the array return_value.

When searching for the delimiter delimiter, the

php_memnstr function was called
php_memnstr(Z_STRVAL_P(str), Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp); And php_memnstr is the macro definition of
zend_memnstr, which is implemented in zend_memnstr, so memchr in C is actually called to find the character delimiter.

After finding the position of the separator, call the

add_next_index_stringl function to insert the separated string into the return array.

implode

<p>string implode ( string $glue, array $pieces )<br />string implode ( array $pieces )</p>



Convert the value of a one-dimensional array to a string

Parameter description

The implode function can receive two parameter orders. Also, if the first parameter is an array and the second parameter is empty, the second parameter is the default value ''. This function can be seen as the reverse process of explode.

Of course, use the documented order to avoid confusion.

Run the example

<span>$arr</span> = <span>array</span>('hello', 'world');

Parameters in document order

<span>$str</span> = <span>implode</span>('-&lsquo;, $arr);// 输出"hello-world"

The first parameter is an array

<span>$str</span> = <span>implode</span>(<span>$arr</span><span>); // 输出"helloworld"
</span><span>$str</span> = <span>implode</span>(<span>$arr</span>, '-'); // 输出"hello-world"

implode执行步骤

<p>1、接收参数并赋值<br />2、如果第二个参数为空,则判断第一个参数的类型是否为数组,如果不是,则报错。否则,则使用""对glue赋值,使用其作为连接符。<br />3、如果第二个参数不为空,那么,如果第一个参数是数组类型,则将第二个参数转换成字符串类型;否则,如果第二个参数是数组类型,则将第一个参数转换成字符串类型。<br />4、调用php_implode函数做字符串的连接。</p>



在implode函数设置完参数之后,底层就调用php_implode函数进行字符串连接,php_implode函数的执行流程图如下:

[PHP source code reading] explode and implode functions, explodeimplode_PHP tutorial // 遍历数组的每一个元素,判断其类型,然后调用smart_str_appendl函数将值追加到字符串中 while (zend_hash_get_current_data_ex(Z_ARRVAL_P(arr), (void **) &tmp, &pos) == SUCCESS) { switch ((*tmp)->type) { case IS_STRING: smart_str_appendl(&implstr, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); break; case IS_LONG: { char stmp[MAX_LENGTH_OF_LONG + 1]; str_len = slprintf(stmp, sizeof(stmp), "%ld", Z_LVAL_PP(tmp)); smart_str_appendl(&implstr, stmp, str_len); } break; case IS_BOOL: if (Z_LVAL_PP(tmp) == 1) { smart_str_appendl(&implstr, "1", sizeof("1")-1); } break; case IS_NULL: break; case IS_DOUBLE: { char *stmp; str_len = spprintf(&stmp, 0, "%.*G", (int) EG(precision), Z_DVAL_PP(tmp)); smart_str_appendl(&implstr, stmp, str_len); efree(stmp); } break; case IS_OBJECT: { int copy; zval expr; zend_make_printable_zval(*tmp, &expr, &copy); smart_str_appendl(&implstr, Z_STRVAL(expr), Z_STRLEN(expr)); if (copy) { zval_dtor(&expr); } } break; default: tmp_val = **tmp; zval_copy_ctor(&tmp_val); convert_to_string(&tmp_val); smart_str_appendl(&implstr, Z_STRVAL(tmp_val), Z_STRLEN(tmp_val)); zval_dtor(&tmp_val); break; } // 添加glue字符 if (++i != numelems) { smart_str_appendl(&implstr, Z_STRVAL_P(delim), Z_STRLEN_P(delim)); } zend_hash_move_forward_ex(Z_ARRVAL_P(arr), &pos); } // 在尾部添加结束字符0 smart_str_0(&implstr);

 

源码解读

php_implode会逐个获取数组里面的内容,然后判断每个元素的类型,再做必要的数据类型转换之后,调用smart_str_appendl函数将值追加到返回的字符串后面。最后,还要在字符串后面加上结束符,这是个必须的操作,以后编程时也应注意。

smart_str_appendl是函数smart_str_appendl_ex的宏定义,该函数调用了memcpy做字符串的复制。

小结

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

暂且写这么多吧,还有更多的优化和PHP源码中常用的函数,将会在以后的源码阅读中慢慢讲述。

如果本文对你有帮助,请点下推荐吧,谢谢^_^

 

最后,我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/1128118.htmlTechArticle[PHP source code reading] explode and implode functions, explodeimplode explode and implode functions are mainly used for conversion between strings and arrays Operations, such as obtaining a parameter and then dividing it according to a certain character...
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Explain the concept of a PHP session in simple terms.Explain the concept of a PHP session in simple terms.Apr 26, 2025 am 12:09 AM

PHPsessionstrackuserdataacrossmultiplepagerequestsusingauniqueIDstoredinacookie.Here'showtomanagethemeffectively:1)Startasessionwithsession_start()andstoredatain$_SESSION.2)RegeneratethesessionIDafterloginwithsession_regenerate_id(true)topreventsessi

How do you loop through all the values stored in a PHP session?How do you loop through all the values stored in a PHP session?Apr 26, 2025 am 12:06 AM

In PHP, iterating through session data can be achieved through the following steps: 1. Start the session using session_start(). 2. Iterate through foreach loop through all key-value pairs in the $_SESSION array. 3. When processing complex data structures, use is_array() or is_object() functions and use print_r() to output detailed information. 4. When optimizing traversal, paging can be used to avoid processing large amounts of data at one time. This will help you manage and use PHP session data more efficiently in your actual project.

Explain how to use sessions for user authentication.Explain how to use sessions for user authentication.Apr 26, 2025 am 12:04 AM

The session realizes user authentication through the server-side state management mechanism. 1) Session creation and generation of unique IDs, 2) IDs are passed through cookies, 3) Server stores and accesses session data through IDs, 4) User authentication and status management are realized, improving application security and user experience.

Give an example of how to store a user's name in a PHP session.Give an example of how to store a user's name in a PHP session.Apr 26, 2025 am 12:03 AM

Tostoreauser'snameinaPHPsession,startthesessionwithsession_start(),thenassignthenameto$_SESSION['username'].1)Usesession_start()toinitializethesession.2)Assigntheuser'snameto$_SESSION['username'].Thisallowsyoutoaccessthenameacrossmultiplepages,enhanc

What are some common problems that can cause PHP sessions to fail?What are some common problems that can cause PHP sessions to fail?Apr 25, 2025 am 12:16 AM

Reasons for PHPSession failure include configuration errors, cookie issues, and session expiration. 1. Configuration error: Check and set the correct session.save_path. 2.Cookie problem: Make sure the cookie is set correctly. 3.Session expires: Adjust session.gc_maxlifetime value to extend session time.

How do you debug session-related issues in PHP?How do you debug session-related issues in PHP?Apr 25, 2025 am 12:12 AM

Methods to debug session problems in PHP include: 1. Check whether the session is started correctly; 2. Verify the delivery of the session ID; 3. Check the storage and reading of session data; 4. Check the server configuration. By outputting session ID and data, viewing session file content, etc., you can effectively diagnose and solve session-related problems.

What happens if session_start() is called multiple times?What happens if session_start() is called multiple times?Apr 25, 2025 am 12:06 AM

Multiple calls to session_start() will result in warning messages and possible data overwrites. 1) PHP will issue a warning, prompting that the session has been started. 2) It may cause unexpected overwriting of session data. 3) Use session_status() to check the session status to avoid repeated calls.

How do you configure the session lifetime in PHP?How do you configure the session lifetime in PHP?Apr 25, 2025 am 12:05 AM

Configuring the session lifecycle in PHP can be achieved by setting session.gc_maxlifetime and session.cookie_lifetime. 1) session.gc_maxlifetime controls the survival time of server-side session data, 2) session.cookie_lifetime controls the life cycle of client cookies. When set to 0, the cookie expires when the browser is closed.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools