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

by admin on 2018年12月18日

功能预览

explode和implode函数首要用作字符串和反复组间转换的操作,比如取一段子参数后遵照某字符分割字符串,或者用一个数组的结果使用一个字符合并成一个字符串输出。在PHP中时时会就此到及时有限个函数,因而有必要精通一下夫原理。

图片 1

横流:Cube上沾满的黄色是自身长的粒子效果。

 

explode

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

函数再次回到由字符串组成的屡屡组,每个元素如故string的一个子串,被字符串$delimiter作为边界点分割出来。

软件条件

NGUI 3.9.x

Unity 5.1 x64

 

参数表达

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

运转结果1

limit为正数时,limit设为1,最多重回1独因素。

$arr = explode(',', $str, 1);
print_r($arr);

运行结果2

limit为负数,limit为-1,再次回到最终的1独要素外之持有因素。

$arr = explode(',', $str, -1);
print_r($arr);

运转结果3

limit为0,当作1处理。

$arr = explode(',', $str, 0);
print_r($arr);

运行结果4

RenderTexture

       RenderTexture是相同种分外的纹路,它是于运作时创制同革新。

文档:http://www.ceeger.com/Components/class-RenderTexture.html

explode执行步骤

1、接收参数,处理参数为空的情

2、创造函数中使用的一部分变量

3、依照limit的值调用不同的函数分隔字符串

explode函数的主导实现是php_explode函数,下边是欠函数的实践流程图:

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

ScrollView

      ngui的一个滑行组件

源码解读

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函数将分隔拿到的字符串插入到回数组里。

UITexture

    ngui展现贴图组件

 

implode

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

以一个一维数组的价转换为字符串

原理

之所以一个照相机单独照射3D模型和粒子 ——> 把相机的图片映射到RenderTexture上
——> 把RenderTexture的图形UITexture
——>通过NGUI的Clip对UITexture进行裁剪

 

参数表达

implode函数可以收两栽参数顺序。此外,假使第一单参数为数组而第二只参数为空,则第二独参数为默认值”。此函数可以当是explode的逆向过程。

本来,使用文档规定的顺序可免混淆。

步骤

1、创造一个RenderTexture,命名吧ModelTexture
图片 2

2、创制一个新的现象,添加NGUI的2D UI

3、修改场景中的渲染模型的Camera名吧:3DCamera,并拿ModelTexure赋给其的Target
Texture

4、添加模型与粒子,我此时盖原型替代,把其消除成一横排

图片 3图片 4

5、修改3DCamera的size,调整模型根节点的职,直到Camera中会全部体现出意况中之模型和粒子,我这儿把3DCamera转移呢2D画面

图片 5图片 6图片 7

6、在UI中创建一个ScrollView和UITexture,UIPanel的之推区域,依据需要调整至同适值。

图片 8图片 9

7、把步骤1创建的ModelTexture,拖给UITexture,并修改Texture的Size为1000×1000,同时给UITexture添加BoxCollider和Drag
ScrollView

图片 10图片 11

8、同时修改ModelTexture的size也改为1000×1000

图片 12

9、运行,调整视觉效果

运行示例

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

遵照文档顺序参数

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

首先单参数为数组

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

完全布局

图片 13

implode执行步骤

1、接收参数并赋值
2、要是第二个参数为空,则判断第一单参数的系列是否也数组,假如无是,则报错。否则,则以””对glue赋值,使用这用作连接符。
3、如若第二只参数不也空,那么,假如第一独参数是数组类型,则将第二个参数转换成字符串类型;否则,假使第二单参数是数组类型,则用首先只参数转换成为字符串类型。
4、调用php_implode函数做字符串的接连。

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

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

注意点

基于需要调动RenderTexture的Size和Camera的Size,达到最佳视觉效果。

源码解读

php_implode会逐个获取数组里面的情节,然后判断每个元素的品类,再做必要之数据类型转换后,调用smart_str_appendl函数将价值扩张到回的字符串前面。最终,还要当字符串前边长了符,这是单必须的操作,未来编程时也答应小心。

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

源码

附件:http://files.cnblogs.com/files/zhaoqingqing/ClipModel.zip 
需要手动导入NGUI3.9.x,基于Unity5.1

小结

小还写这么多,还有复多的优化和PHP源码中常用之函数,将谋面以之后的源码阅读中日益讲述。

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

只要本文对您生出辅助,请点下推荐吧,谢谢\_

自家于github有对PHP源码更详细的声明。感兴趣之可扫描一下,给个star。PHP5.4源码讲明。可以经commit记录查阅已长的诠释。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图