精华内容
下载资源
问答
  • 下里说道php中的explodeimplode的用法,芭蕾舞鞋,盼望对于友朋们有所辅助!
  • explode and implode

    2016-05-31 14:43:00
    explodeimplode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出。在PHP中经常会用到这两个函数,因此有必要了解一下其...

    [PHP源码阅读]explode和implode函数

     

    explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出。在PHP中经常会用到这两个函数,因此有必要了解一下其原理。

    我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

    explode

    array 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函数不会计算\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函数可以接收两种参数顺序。另外,如果第一个参数为数组而第二个参数为空,则第二个参数为默认值''。此函数可以看作是explode的逆向过程。

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

    运行示例

    $arr = array('hello', 'world');

     

    按照文档顺序参数

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

     

    第一个参数为数组

    $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);
    复制代码

     

    源码解读

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

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

    小结

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

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

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

     

    最后再安利一下,我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

    更多源码文章,欢迎访问个人主页继续查阅:hoohack

     
     

    转载于:https://www.cnblogs.com/zzc134680/p/5545808.html

    展开全文
  • 这两项技术的实现主要通过implode()和explode()函数来完成。 语法: explode(separator,string,limit) separator 必需。规定在哪里分割字符串。 string 必需。要分割的字符串。 limit 可选。规定所返回的数组元素的...
    字符串的连接与分割是非常重要的两个内容,通过其可以将数组按照指定的规则转换成字符串,也可以将字符串按照指定的规则进行分割,返回一个数组。其应用范围很广,如在购物网站的购物车,在线投票系统等。这两项技术的实现主要通过implode()和explode()函数来完成。
    
    语法:
    explode(separator,string,limit)
    separator 必需。规定在哪里分割字符串。
    string 必需。要分割的字符串。
    limit 可选。规定所返回的数组元素的最大数目。
    
    implode(separator,array) 
    separator 可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
    array 必需。要结合为字符串的数组。
    
    <?php
    	$_arr = array('red','color','blue');
    	$_arrStr = implode(',',$_arr);//返回一个由数组元素逗号隔开组合成的字符串
    	echo $_arrStr;  //red,color,blue
    	echo '<br/>';
    	$_arrArr = explode(',',$_arrStr);//以逗号分隔字符串组成数组
    	print_r($_arrArr);//Array ( [0] => red [1] => color [2] => blue )
    ?>
    区别:
    1. explode() 函数把字符串分割为数组;
       implode() 函数把数组元素组合为一个字符串。
    
    2. explode() 由于历史原因不能接收两种参数顺序,必须保证separator参数在string参数之前才行;
       implode() 可以接受两种参数顺序。
    展开全文
  • 这篇文章主要介绍了关于浅谈PHP源码一:explodeimplode函数,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下一、explodeimplode函数array explode ( string separator, string string [, int ...

    这篇文章主要介绍了关于浅谈PHP源码一:explode和implode函数,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

    一、explode和implode函数

    array explode ( string separator, string string [, int limit] )

    此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 separator 作为边界点分割出来。如果设置了 limit 参数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。

    此函数的时间复杂度应该是O(strlen(separator) * strlen(string))

    其实现过程基本上是遍历字符串string,将它与separator比较,如果相同,则写入hash表,并将string的指针移到新的位置(即每一个separator的右边);

    另外,对于limit小于0的情况有特殊处理

    本函数实现主要是依赖于php_memnstr函数,在php.h文件中我们可以看到它的定义,

    #define php_memnstr zend_memnstr

    其真正的函数是zend_memnstr,在Zend/zend_operators.h文件的217行,可以看到它的定义,其实现主要是一个while循环和两个C语言的函数memchr和memcmp

    string implode ( string glue, array pieces )

    此函数返回一个以glue字符串连接的pieces数组的各元素的字符串。

    此函数可以是以一个数组为参数,可以是以一个数组和一个字符串为参数,并且字符串和数组的顺序可以改变,这些在程序中都有针对每种情况的特殊处理,如下代码:if (argc == 1) {

    if (Z_TYPE_PP(arg1) != IS_ARRAY) { // 只有一个参数并且还不是数组

    php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument must be an array");

    return;

    }

    MAKE_STD_ZVAL(delim);#define _IMPL_EMPTY ""

    ZVAL_STRINGL(delim, _IMPL_EMPTY, sizeof(_IMPL_EMPTY) - 1, 0);

    SEPARATE_ZVAL(arg1);

    arr = *arg1;

    } else { // 两个参数

    if (Z_TYPE_PP(arg1) == IS_ARRAY) { // 如果每一个参数是数组

    arr = *arg1;

    convert_to_string_ex(arg2);

    delim = *arg2;

    } else if (Z_TYPE_PP(arg2) == IS_ARRAY) { // 如果第二个参数是数组

    arr = *arg2;

    convert_to_string_ex(arg1);

    delim = *arg1;

    } else {

    php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid arguments passed");

    return;

    }

    }

    最后数组都会赋值给arr,分隔字符串赋值给delim,没有的置为””

    就是一个遍历数组,并连接字符串的过程,只是这个过程中使用了smart_str相关函数(更多相关请移步 ),针对不同的类型作了不同的连接操作(如果是数字还需要将数字转化成字符串,这些在smart_str中都有相关函数处理)

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    关于PHP中strtr函数一些奇怪行为的解释

    关于PHP源码中HashTable的解析

    展开全文
  • explodeimplode

    2016-05-19 11:05:00
    <?... $str = "HellooooLAAAAAALleeellll33432ll!"; ...//字符拆分,当2个“l”并列出现,元素结果是...$str=explode("l",$str); var_dump($str); //数组内部拼接 $S = implode(",",$str); var_dump($S); ?...

    <?php
    
    $str = "HellooooLAAAAAALleeellll33432ll!";
    
    //字符拆分,当2个“l”并列出现,元素结果是空格“ ”,所有的结果是一维数组
    $str=explode("l",$str);
    var_dump($str);
    
    //数组内部拼接
    $S = implode(",",$str);
    var_dump($S);
    
    ?>  

     

    转载于:https://www.cnblogs.com/wanlibingfeng/p/5507968.html

    展开全文
  • explode_implode.php

    2016-05-06 16:30:29
     explode_implode.php             echo "通过空格分隔字符串:"; $pizza = "a1 a2 a3 a4 a5 a6"; //通过空格分隔 $pieces = explode(" ", $pizza); //输出返回数组的头两个
  • php中explodeimplode函数 explode array explode ( string $delimiter, string $string, [ , $limit ] ) 函数返回由字符串组成的数组,每个元素都是string的一个子串,被字符串$delimiter作为边界点...
  • PHP explodeimplode 用法

    千次阅读 2017-07-10 15:41:10
    explode() 函数把字符串分割为数组;implode() 函数把数组元素组合为一个字符串。
  • implodeexplode 区别

    2020-07-06 14:16:32
    implode是把数组根据分隔符拆分合成一个字符串。 implode(";", $arr); explode是把一个字符串根据分隔符打散并合成一个数组。 explode(";", $arr);
  • php中的explodeimplode

    2016-04-20 16:04:43
    explode的功能是使用一个字符串分割另一个字符串。返回一个分割后的数组。 来看explode的基本用法: $str = 'xaaxbbx'; $data = explode('x', $str); echo ""; print_r($data); echo ""; ?> 程序输出为: ...
  • 【PHP】explodeimplode

    2019-10-01 20:58:02
    1.explode — 使用一个字符串分割另一个字符串(字符串转换为数组) array explode ( string $delimiter , string $string [, int $limit ] ) <?php  $pizza = "piece1 piece2 piece3 piece4 piece5 ...
  • implode() 函数把数组元素组合为一个字符串。 explode 定义 array explode ( string $delimiter , string $string [, int $limit = PHP_INT_MAX ] )  参数: limit 限制结果的个数。 $str = "hi, jason, ...
  • $arr1 = explode(",", $str1); $arr2 = explode(",", $str2); &lt;1&gt;print_r($arr1); &lt;1&gt;print_r($arr2); $arr2 = [$arr2[1]]; &lt;2&
  • explodeimplode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出。在PHP中经常会用到这两个函数,因此有必要了解一下其...
  • PHP的explodeimplode

    2011-07-16 15:54:00
    <?php $zongzi = "1|2|3|4|5|6"; $zongzi = explode("|",$zongzi); var_dump($zongzi); $zongzi = implode("|",$zongzi); echo $zongzi;?> 转载于:https://www.cnblogs.co...
  • PHP中explodeimplode的用法_2240

    千次阅读 2010-06-22 17:48:00
    教习php的友朋们也晓得,数组也是必需把握的,能够那样道,进修php,也便是教习php中的数组而在数组中通常要用到分割字符串啊什么的,便要用到explode ,和implode函数,下里说道php中的explodeimplode的用法,芭蕾舞鞋,...
  • 今天分享一下go语言中与PHP语言中有相同作用的两个函数explodeimplode 定义一个自字符串数组 strArray:=[]string{“1”,“2”,“3”,“4”,“5”} php中的 implode 与 go中的 strings.Join(数组元素组合为...
  • PHP::explode/implode

    2013-01-31 10:00:13
    array explode ( string $delimiter , string $string [, int $limit ] ) 此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 delimiter 作为边界点分割出来。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,610
精华内容 4,244
关键字:

explode的区别implode