摘要:在实现里面,如果大于,则调用函数如果小于,则调用函数如果等于,则被当做处理,此时调用函数将添加到数组中。找到分隔符的位置之后,就调用函数将分隔得到的字符串插入到返回数组里。此函数可以看作是的逆向过程。调用函数做字符串的连接。
explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出。在PHP中经常会用到这两个函数,因此有必要了解一下其原理。
我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。
explodearray explode ( string $delimiter, string $string, [ , $limit ] )
函数返回由字符串组成的数组,每个元素都是string的一个子串,被字符串$delimiter作为边界点分割出来。
参数说明limit
如果设置了limit,且为正数,则返回的数组最多包含limit个元素,最后的那个元素将包含string的剩余部分。
如果limit是负数,则返回除了最后的-$limit个元素外的所有元素。
如果limit是0,则会被当做1。
delimiter
如果delimiter为空,则函数返回FALSE。如果delimiter不在string中,且limit为负数,则返回空数组。
运行示例$str = "hello,world,heiheihei,php";
先来看看不设置limit的情况
$arr = explode(",", $str); print_r($arr);
limit为正数时,limit设为1,最多返回1个元素。
$arr = explode(",", $str, 1); print_r($arr);
limit为负数,limit为-1,返回最后的1个元素外的所有元素。
$arr = explode(",", $str, -1); print_r($arr);
limit为0,当作1处理。
$arr = explode(",", $str, 0); print_r($arr);explode执行步骤
1、接收参数,处理参数为空的情况
2、创建函数中使用的局部变量
3、根据limit的值调用不同的函数分隔字符串
explode函数的核心实现是php_explode函数,下面是该函数的执行流程图:
php_explode函数核心代码:
if (p2 == NULL) { // 找不到分隔符,直接返回整个字符串 add_next_index_stringl(return_value, p1, Z_STRLEN_P(str), 1); } else { do { // 将p1添加到return_value数组中 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); // 将最后一个值添加到return_value if (p1 <= endp) add_next_index_stringl(return_value, p1, endp-p1, 1); }源码解读
sizeof("") == 0。sizeof有两种用法,sizeof(typename)和sizeof(expression),当参数为typename是,即类型名称,sizeof返回类型对应对象的大小;当参数为表达式时,sizeof计算表达式的返回类型对应对象的大小。此处,""是表达式,sizeof计算编译时编译器分配给""的空间,此时要算上0的长度,因此是1,而strlen函数不会计算