[php源码阅读]explode和implode函数,explodeimplodeexplode和implode函数主要用作字符串-数组的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出。在php中经常会用到这两个函数,因此有必要了解一下其原理。
explodearray explode ( string $delimiter, string $string, [ , $limit ] )
返回由字符串组成的数组,每个元素都是string的一个子串,被字符串$delimiter作为边界点分割出来。
$limit如果设置了$limit,且为正数,则返回的数组最多包含$limit个元素,最后的那个元素将包含$string的剩余部分。
如果$limit是负数,则返回除了最后的-$limit个元素外的所有元素。
如果$limit是0,则会被当做1。
$delimiter如果$delimiter为空,则函数返回false。如果delimiter不在string中,且$limit为负数,则返回空数组。
核心源码 // 如果delimiter为空字符串,返回false if (delim_len == 0) { php_error_docref(null tsrmls_cc, e_warning, empty delimiter); return_false; } // 初始化返回的数组 array_init(return_value); if (str_len == 0) { if (limit >= 0) { // 如果字符串为空且limit大于等于0,则返回一个包含空字符串的数组,注意此处sizeof() == 1 add_next_index_stringl(return_value, , sizeof() - 1, 1); } return; } // 初始化zstr和zdelim的字符串变量 zval_stringl(&zstr, str, str_len, 0); zval_stringl(&zdelim, delim, delim_len, 0); if (limit > 1) { // limit大于1,limit默认是long_max php_explode(&zdelim, &zstr, return_value, limit); } else if (limit 1); // 将最后一个值追加到return_value if (p1 <= endp) add_next_index_stringl(return_value, p1, endp-p1, 1); }
实现时调用了add_next_index_stringl将得到的每个字符串添加到数组return_value中。add_next_index_string是此功能的核心函数。
zend_api int add_next_index_stringl(zval *arg, const char *str, uint length, int duplicate) { zval *tmp; make_std_zval(tmp); zval_stringl(tmp, str, length, duplicate); return zend_hash_next_index_insert(z_arrval_p(arg), &tmp, sizeof(zval *), null);}
add_next_index_stringl函数调用zend_hash_next_index_insert函数将str插入到数组中。再看看php_explode_negative_limit函数的源码
php_explode_negative_limit// 如果delimiter不在string中,且limit为负数,什么都不做,返回空的array,p2为null表示delimiter不在string中 if (p2 == null) { /*
如果limit c + __dest->len, (src), (nlen)); \ __dest->len = __nl; \} while (0)
smart_str_appendl_ex主要调用memcpy函数进行字符串复制。
原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
如果本文对你有帮助,点个推荐吧,谢谢^_^。
更多php源码阅读文章:
[php源码阅读]strlen函数
[php源码阅读]strpos、strstr和stripos、stristr函数
http://www.bkjia.com/phpjc/1127592.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/1127592.htmltecharticle[php源码阅读]explode和implode函数,explodeimplode explode和implode函数主要用作字符串-数组的操作,比如获取一段参数后根据某个字符分割字符串,...