PHP源码之explode使用说明
前端之家收集整理的这篇文章主要介绍了
PHP源码之explode使用说明,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我们需要将一个数组根据某个字符或字串进行分割成数组的时候,explode用的很happy,但是你知道~explode是怎么工作的么~~
首先可以肯定的是,explode也是会分配空间的,毫无疑问。
<div class="codetitle"><a style="CURSOR: pointer" data="48379" class="copybut" id="copybut48379" onclick="doCopy('code48379')"> 代码如下:
<div class="codebody" id="code48379">
//
文件1:ext/standard/string.c
//先来看下explode的源
代码 PHP_FUNCTION(explode)
{
char
str,delim;
int str_len = 0,delim_len = 0;
long limit = LONG_MAX; /
No limit /
zval zdelim,zstr;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"ss|l",&delim,&delim_len,&str,&str_len,&limit) == FAILURE) {
return;
}
if (delim_len == 0) {
PHP_error_docref(NULL TSRMLS_CC,E_WARNING,"Empty delimiter");
RETURN_FALSE;
}
//这里会开辟一个数组,用来存放分割后的数据
array_init(return_value);
//因为这个,我们用explode('|','');成为了合法的
if (str_len == 0) {
if (limit >= 0) {
add_next_index_stringl(return_value,"",sizeof("") - 1,1);
}
return;
}
//下面这两个是将原字串和分割符都构建成_zval_struct 结构,
//ZVAL_STRINGL会分配空间哦~~源
代码随后贴出
ZVAL_STRINGL(&zstr,str,str_len,0);
ZVAL_STRINGL(&zdelim,delim,delim_len,0);
//limit值是explode中允许传递的explode的第三个参数,它允许正负
if (limit > 1) {
PHP_explode(&zdelim,&zstr,return_value,limit);
} else if (limit < 0) {
PHP_explode_negative_limit(&zdelim,limit);
} else {
add_index_stringl(return_value,1);
}
}