【PHP源码阅读】explode和implode函数,explodeimplode_PHP教程
【PHP源码阅读】explode和implode函数,explodeimplode
explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出。在PHP中经常会用到这两个函数,因此有必要了解一下其原理。
explode
<p>array explode ( string $delimiter, string $string, [ , $limit ] )</p>
函数返回由字符串组成的数组,每个元素都是string的一个子串,被字符串$delimiter作为边界点分割出来。
参数说明
limit
如果设置了$limit,且为正数,则返回的数组最多包含$limit个元素,最后的那个元素将包含$string的剩余部分。
如果$limit是负数,则返回除了最后的-$limit个元素外的所有元素。
如果$limit是0,则会被当做1。
delimiter
如果$delimiter为空,则函数返回FALSE。如果delimiter不在string中,且$limit为负数,则返回空数组。
运行示例
<span>$str</span> = 'hello,world,heiheihei,php';
先来看看不设置limit的情况
<span>$arr</span> = <span>explode</span>(',', <span>$str</span><span>); </span><span>print_r</span>(<span>$arr</span>);
limit为正数时,limit设为1,最多返回1个元素。
<span>$arr</span> = <span>explode</span>(',', <span>$str</span>, 1<span>); </span><span>print_r</span>(<span>$arr</span>);
limit为负数,limit为-1,返回最后的1个元素外的所有元素。
<span>$arr</span> = <span>explode</span>(',', <span>$str</span>, -1<span>); </span><span>print_r</span>(<span>$arr</span>);
limit为0,当作1处理。
<span>$arr</span> = <span>explode</span>(',', <span>$str</span>, 0<span>); </span><span>print_r</span>(<span>$arr</span>);
explode执行步骤
<p>1、接收参数,处理参数为空的情况</p> <p>2、创建函数中使用的局部变量</p> <p>3、根据limit的值调用不同的函数分隔字符串</p>
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
<p>string implode ( string $glue, array $pieces )<br />string implode ( array $pieces )</p>
将一个一维数组的值转换为字符串
参数说明
implode函数可以接收两种参数顺序。另外,如果第一个参数为数组而第二个参数为空,则第二个参数为默认值''。此函数可以看作是explode的逆向过程。
当然,使用文档规定的顺序可避免混淆。
运行示例
<span>$arr</span> = <span>array</span>('hello', 'world');
按照文档顺序参数
<span>$str</span> = <span>implode</span>('-‘, $arr);// 输出"hello-world"
第一个参数为数组
<span>$str</span> = <span>implode</span>(<span>$arr</span><span>); // 输出"helloworld" </span><span>$str</span> = <span>implode</span>(<span>$arr</span>, '-'); // 输出"hello-world"
implode执行步骤
<p>1、接收参数并赋值<br />2、如果第二个参数为空,则判断第一个参数的类型是否为数组,如果不是,则报错。否则,则使用""对glue赋值,使用其作为连接符。<br />3、如果第二个参数不为空,那么,如果第一个参数是数组类型,则将第二个参数转换成字符串类型;否则,如果第二个参数是数组类型,则将第一个参数转换成字符串类型。<br />4、调用php_implode函数做字符串的连接。</p>
在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, ©);
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源码注解。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP의 폭발 함수는 문자열을 배열로 분할하는 데 사용되는 함수입니다. 매우 일반적이고 유연합니다. 분해 기능을 사용하는 과정에서 몇 가지 오류와 문제가 자주 발생합니다. 이 기사에서는 분해 기능의 기본 사용법을 소개하고 오류 보고서를 해결하는 몇 가지 방법을 제공합니다. 1. 분해 함수의 기본 사용법 PHP에서 분해 함수의 기본 구문은 다음과 같습니다.

제목: PHP에서 분해 함수를 사용할 때 발생하는 일반적인 오류 및 해결 방법 PHP에서 분해 함수는 문자열을 배열로 분할하는 데 사용되는 일반적인 함수입니다. 그러나 부적절한 사용이나 잘못된 데이터 형식으로 인해 일부 일반적인 오류가 발생할 수 있습니다. 이 문서에서는 분해 기능을 사용할 때 발생할 수 있는 문제를 분석하고 해결 방법과 구체적인 코드 예제를 제공합니다. 실수 1: 구분자 매개변수가 전달되지 않습니다. 분해 기능을 사용할 때 가장 일반적인 실수 중 하나는 구분자 매개변수가 전달되지 않는다는 것입니다.

PHP 프로그래밍에서 문자열 처리는 자주 필요한 작업입니다. 그중 문자열 분할 및 병합은 두 가지 일반적인 요구 사항입니다. 이러한 작업을 보다 편리하게 수행하기 위해 PHP는 두 가지 매우 실용적인 기능, 즉 분해 및 내파 기능을 제공합니다. 이 기사에서는 이 두 가지 기능의 사용법과 몇 가지 실용적인 기술을 소개합니다. 1. 분해 함수 분해 함수는 지정된 구분 기호에 따라 문자열을 분할하고 배열을 반환하는 데 사용됩니다. 함수 프로토타입은 다음과 같습니다: arra

PHP 폭발 오류 해결 방법: 1. 잘못된 PHP 코드를 찾아 엽니다. 2. 폭발 함수 부분을 찾습니다. 3. 코드를 "dump(explode(',',$str));die;"로 수정합니다. , 배열을 쉼표로 구분하여 사용하세요.

문자열을 배열로 분할하려면 PHP 함수 "explode"를 사용하십시오. PHP 개발에서는 지정된 구분 기호에 따라 문자열을 분할해야 하는 상황이 자주 발생합니다. 이때 PHP에 내장된 "explode" 함수를 사용하여 문자열을 배열로 변환할 수 있습니다. 이 문서에서는 "explode" 기능을 사용하여 문자열을 분할하는 방법을 소개하고 관련 코드 예제를 제공합니다. "explode" 함수의 기본 구문은 다음과 같습니다.

PHP 언어에는 문자열을 빠르고 효율적으로 처리하는 데 도움이 되는 많은 기본 함수가 있습니다. 그중 폭발 기능은 매우 실용적인 문자열 분할 기능입니다. 지정된 구분 기호에 따라 문자열을 배열로 분할한 다음 보다 유연한 문자열 작업을 수행할 수 있습니다. 이 기사에서는 폭발 기능을 사용하여 PHP에서 문자열을 분할하는 방법을 소개합니다. 1. 분해 함수의 형식은 PHP 언어에서 분해 함수의 형식은 다음과 같습니다.

문자열을 여러 하위 문자열로 분할하려면 PHP 함수 "explode"를 사용하세요. PHP 프로그래밍에서는 문자열을 여러 하위 문자열로 분할해야 하는 상황이 자주 발생합니다. 이때 PHP에서는 이 기능을 쉽게 구현할 수 있도록 도와주는 매우 편리한 "explode" 기능을 제공합니다. "explode" 함수의 구문은 다음과 같습니다: arrayexplode(string$delimiter,string$string[,in

이 기사에서는 사전 정의된 내장 PHP 함수인 PHPExplode() 함수를 사용하는 방법을 알아봅니다. 폭발 함수는 "문자열을 더 작은 내용으로 분할하는 데 사용됩니다. PHP의 폭발 함수를 사용하면 문자열을 나누어 더 작은 내용으로 나눌 수 있습니다. 이러한 유형의 구분 기호를 구분 기호라고 합니다. 구문 폭발(구분 기호, 문자열, 요소 수) ) 매개변수 전개 기능은 세 개의 매개변수를 허용하며 그 중 두 개는 필수이고 하나는 선택사항입니다. 구분 기호 이 문자는 문자열에서 이 문자가 발견될 때마다 임계점을 지정합니다. , 이는 배열에 있는 한 요소의 끝과 문자열 입력 문자열에 있는 다른 요소의 시작을 상징합니다.
