explode()和implode函数的用法详解

PHP 来源:用户投稿 收藏

在网站制作中经常使用到分割字符串为数组或将数组拼接成字符串的功能,php中内置的explode(分割)和implode(拼接)为我们提供了分割和拼接的功能。使用方法也是非常的简单。

explode:

分割字符串,使用一个字符串分割另一个字符串,返回一个数组

$array  = explode ( string $delimiter , string $string [, int $limit ] )

此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 delimiter 作为边界点分割出来。参数由3部分组成,分隔符、字符串、分隔限制组成

explode函数实例详解:

$string = 'a,b,c,d,e,f'; 
var_dump(explode(',', $string)); // 无limit的情况 
var_dump(explode(',', $string,2)); 
var_dump(explode(',', $string,-1)); 
var_dump(explode(',', $string,0)); 
var_dump(explode(',', $string,1));

16801629719d3866

对于分割字符串来说,2个参数足以使用。当然也会有特殊情况,第三个参数通过正负来达到不同的功能,也是看了手册之后才知道explode还有这个功能。

如果第三个参数limit是正数的话,代表分割时只会分割成几份,最后的一份会包含剩余部分。

如果limit是负数,则只分割除最后几项的的字符串。

如果limit是0,则和参数为1一样,返回整体字符串出来。

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);
}

explode() 源码解读

sizeof(&ldquo;&rdquo;) == 0。sizeof有两种用法,sizeof(typename)和sizeof(expression),当参数为typename是,即类型名称,sizeof返回类型对应对象的大小;当参数为表达式时,sizeof计算表达式的返回类型对应对象的大小。此处,&rdquo;&ldquo;是表达式,sizeof计算编译时编译器分配给“”的空间,此时要算上\0的长度,因此是1,而strlen函数不会计算\0。

如果不设置limit,limit的默认值是LONG_MAX。在php.h文件中,LONG_MAX定义为2147483647L。

在实现里面,如果limit大于1,则调用php_explode函数;如果limit小于0,则调用php_explode_negative_limit函数;如果limit等于0,则被当做1处理,此时调用add_index_stringl函数将str添加到数组return_value中。

在查找分隔符delimiter时,调用了php_memnstr函数 php_memnstr(Z_STRVAL_P(str), Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp); 而php_memnstr是zend_memnstr的宏定义,zend_memnstr实现里面,因此实际上是调用了C里面的memchr来查找字符delimiter。

找到分隔符的位置之后,就调用add_next_index_stringl函数将分隔得到的字符串插入到返回数组里。

implode:

将一个一维数组的值转换为字符串

string implode ( string $glue, array $pieces )
string implode ( array $pieces )

 implode参数说明

implode函数可以接收两种参数顺序。另外,如果第一个参数为数组而第二个参数为空,则第二个参数为默认值&rsquo;&lsquo;。此函数可以看作是explode的逆向过程。

当然,使用文档规定的顺序可避免混淆。

implode函数示例

<?php
$arr = array('Hello','World!','I','like','php!');
echo implode(",",$arr);
?>

输出:

Hello,World!,I,like php!

implode()也可以不传分隔符,默认为&ldquo; &rdquo;空字符串分割。

$arr = array('Hello','World!','I','love','zhongguo!');
echo implode(" ",$arr);

输出:

Hello World! I love zhongguo!

刚才我们第一个参数都是分隔符,第一个参数如果是数组会怎么样呢?

第一个参数为数组

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

implode() 执行步骤

  1. 接收参数并赋值

  2. 如果第二个参数为空,则判断第一个参数的类型是否为数组,如果不是,则报错。否则,则使用“”对glue赋值,使用其作为连接符。

  3. 如果第二个参数不为空,那么,如果第一个参数是数组类型,则将第二个参数转换成字符串类型;否则,如果第二个参数是数组类型,则将第一个参数转换成字符串类型。

  4. 调用php_implode函数做字符串的连接。

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

php_implode函数核心代码:

// 遍历数组的每一个元素,判断其类型,然后调用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);

implode函数解读

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

另外implode函数还有个别名函数 join()

$array = ['a','b','c','d','e']; 
var_dump(implode('|',$array)); 
echo ""; 
var_dump(implode($array)); 
echo ""; 
var_dump(join('|',$array)); 
echo ""; 
var_dump(join($array));

1680163132a45631

explode用法和php implode用法总结:

  1. explode函数 使用一个分割符将一个字符串分割成一个数组

  2. implode函数 使用一个分割符将一个数组拼接成一个字符串

  3. join函数 implode函数的别名


免责声明:1.凡本站注明“来源:XXX(非小二胡工作室)”的作品,均转载自其它媒体,所载的文章、图片、音频视频文件等资料的版权归版权所有人所有,如有侵权,请联系xiaoerhu#88.com处理;2.凡本站转载内容仅代表作者本人观点,与小二胡工作室无关。
0 条评论

网友留言