目次
【PHPソースコードの読み方】explode関数とimplode関数、explodeimplode
爆発する
パラメータの説明
サンプルを実行する
実行ステップを分解する
implode执行步骤
源码解读
小结
ホームページ バックエンド開発 PHPチュートリアル [PHP ソース コードの読み取り]explode 関数と implode 関数、explodeimplode_PHP チュートリアル

[PHP ソース コードの読み取り]explode 関数と implode 関数、explodeimplode_PHP チュートリアル

Jul 12, 2016 am 08:51 AM
explode

【PHPソースコードの読み方】explode関数とimplode関数、explodeimplode

explode関数とimplode関数は、パラメータを取得した後に特定の文字に従って文字列を分割したり、文字列を分割したりするなど、主に文字列と配列間の変換操作に使用されます。配列 結果は、1 つの文字を使用して文字列出力に結合されます。これら 2 つの関数は PHP でよく使用されるため、その原理を理解する必要があります。

爆発する

リーリー

この関数は、文字列で構成される配列を返します。各要素は、境界点として文字列 $delimiter で区切られた、文字列の部分文字列です。

パラメータの説明

制限

$limit が設定されており、それが正の数である場合、返される配列には最大で $limit 要素が含まれ、最後の要素には $string の残りが含まれます。

$limit が負の数の場合、最後の -$limit 要素を除くすべての要素を返します。

$limitが0の場合は1として扱われます。

区切り文字

$delimiter が空の場合、関数は FALSE を返します。区切り文字が文字列内になく、$limit が負の数の場合は、空の配列が返されます。

サンプルを実行する

リーリー

まずは制限を設けずに状況を見てみましょう

リーリー

limit が正の数の場合、limit は 1 に設定され、最大 1 つの要素が返されます。

リーリー

limit は負の数、limit は -1 で、最後の要素を除くすべての要素が返されます。

リーリー

limit は 0 であり、1 として扱われます。

リーリー

実行ステップを分解する

リーリー

explode 関数のコア実装は php_explode 関数です。以下は、この関数の実行フローチャートです。

[PHP ソース コードの読み取り]explode 関数と implode 関数、explodeimplode_PHP チュートリアルif (p2 == NULL) { // 区切り文字が見つからない場合は、文字列全体が直接返されます add_next_index_stringl(return_value, p1, Z_STRLEN_P(str), 1); } { する { // 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 && -- 制限 > 1); // return_value に最後の値を追加します if (p1 endp) add_next_index_stringl(return_value, p1, endp-p1, 1); } ソースコードの解釈

sizeof("") == 0

。 sizeof には、sizeof(typename)sizeof(expression) の 2 つの用途があります。パラメーターが typename、つまり型名の場合、sizeof は、パラメーターが式の場合、その型に対応するオブジェクトのサイズを返します。 、sizeof は式を計算します。戻り値の型はオブジェクトのサイズに対応します。ここで、"" はコンパイル時にコンパイラによって "" に割り当てられるスペースを計算する式です。 制限が設定されていない場合、制限のデフォルト値は LONG_MAX

です。 php.h ファイルでは、LONG_MAX は 2147483647L として定義されています。

実装では、制限が 1 より大きい場合は php_explode

関数が呼び出され、制限が 0 より小さい場合は

php_explode_negative_limit 関数が呼び出されます。 、そして add_index_stringl 関数が呼び出されて、配列 return_value に str が追加されます。 区切り文字を検索する場合、php_memnstr

関数は

php_memnstr(Z_STRVAL_P(str), Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp);
そしてphp_memnstrはzend_memのマクロ定義ですnstr、内部には zen d_memnstr 実装があるため、文字区切り文字を見つけるために C の memchr が実際に呼び出されます。
セパレータの位置を見つけたら、add_next_index_stringl

関数を呼び出して、分割された文字列を戻り配列に挿入します。

爆裂 リーリー

一次元配列の値を文字列に変換します

パラメータの説明

implode関数は2つのパラメータオーダーを受け取ることができます。また、最初のパラメータが配列で 2 番目のパラメータが空の場合、2 番目のパラメータはデフォルト値 '' になります。この機能は、爆発の逆のプロセスとみなすことができます。

もちろん、混乱を避けるために、ドキュメントで指定されている順序を使用してください。

サンプルを実行する

リーリー

ドキュメント順序のパラメータ

リーリー

最初のパラメータは配列です

リーリー

implode执行步骤

<p>1、接收参数并赋值<br />2、如果第二个参数为空,则判断第一个参数的类型是否为数组,如果不是,则报错。否则,则使用""对glue赋值,使用其作为连接符。<br />3、如果第二个参数不为空,那么,如果第一个参数是数组类型,则将第二个参数转换成字符串类型;否则,如果第二个参数是数组类型,则将第一个参数转换成字符串类型。<br />4、调用php_implode函数做字符串的连接。</p>



ログイン後にコピー

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

[PHP ソース コードの読み取り]explode 関数と implode 関数、explodeimplode_PHP チュートリアル // 遍历数组的每一个元素,判断其类型,然后调用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源码注解。

www.bkjia.com本当http://www.bkjia.com/PHPjc/1128118.html技術記事 【PHPソースコード読み込み】explode関数とimplode関数、explodeimplodeexplode関数とimplode関数は主に、パラメータを取得して特定の文字に応じて分割するなど、文字列と配列間の変換操作に使用されます...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPのexplode関数の使い方とエラー解決方法 PHPのexplode関数の使い方とエラー解決方法 Mar 10, 2024 am 09:18 AM

PHP のexplode関数は、文字列を配列に分割するために使用される関数で、非常に一般的で柔軟性があります。分解関数を使用する過程で、エラーや問題が発生することがよくありますが、この記事では、分解関数の基本的な使用方法を紹介し、エラー報告を解決するいくつかの方法を紹介します。 1.explode関数の基本的な使い方 PHPでは、explode関数の基本的な構文は次のとおりです。explode(string$separator,string$stri

PHP で展開関数を使用する場合の一般的なエラーと解決策 PHP で展開関数を使用する場合の一般的なエラーと解決策 Mar 11, 2024 am 08:33 AM

タイトル: PHP でexplode関数を使用する際の一般的なエラーと解決策 PHPでは、explode関数は、文字列を配列に分割するために使用される一般的な関数です。ただし、不適切な使用や不正なデータ形式が原因で、いくつかの一般的なエラーが発生する可能性があります。この記事では、explode 関数の使用時に発生する可能性のある問題を分析し、解決策と具体的なコード例を示します。間違い 1: delimiter パラメーターが渡されない。explode 関数を使用するときに最もよくある間違いの 1 つは、delimiter パラメーターが渡されないことです。

explode関数とimplode関数を使用して文字列を分割および結合する explode関数とimplode関数を使用して文字列を分割および結合する Jun 15, 2023 pm 08:42 PM

PHP プログラミングでは、文字列の処理は頻繁に必要な操作です。その中で、文字列の分割と結合は 2 つの一般的な要件です。これらの操作をより便利に実行するために、PHP は 2 つの非常に実用的な関数、つまり、explode 関数と implode 関数を提供します。この記事では、これら2つの機能の使い方と実践スキルを紹介します。 1.explode関数explode関数は、指定された区切り文字に従って文字列を分割し、配列を返すために使用されます。その関数プロトタイプは次のとおりです。

PHP関数「explode」を使用して文字列を配列に分割する PHP関数「explode」を使用して文字列を配列に分割する Jul 24, 2023 pm 11:09 PM

PHP 関数「explode」を使用して、文字列を配列に分割します。PHP 開発では、指定された区切り文字に従って文字列を分割する必要がある状況によく遭遇します。このとき、PHP の組み込み関数「explode」を使用して文字列を配列に変換できます。この記事では、「explode」関数を使用して文字列を分割する方法と、関連するコード例を紹介します。 「explode」関数の基本構文は次のとおりです。

php 爆発でエラーが報告された場合はどうすればよいですか? php 爆発でエラーが報告された場合はどうすればよいですか? Jan 18, 2023 am 10:13 AM

PHP 爆発エラーの解決策: 1. 間違った PHP コードを見つけて開きます; 2. 爆発関数部分を見つけます; 3. コードを「dump(explode(',',$str));die;」に変更します。 、配列をカンマで区切るだけを使用します。

PHPでexplode関数を使用して文字列を分割する方法 PHPでexplode関数を使用して文字列を分割する方法 Jun 26, 2023 pm 12:03 PM

PHP 言語には、文字列を迅速かつ効率的に処理するのに役立つ基本的な関数が多数あります。その中でもexplode関数は非常に実用的な文字列分割関数です。指定された区切り文字に従って文字列を配列に分割し、より柔軟な文字列操作を実行できます。この記事では、PHPで文字列を分割するexplode関数の使い方を紹介します。 1.explode関数の形式 PHP言語でのexplode関数の形式は次のとおりです。

PHP 関数「explode」を使用して文字列を複数の部分文字列に分割する PHP 関数「explode」を使用して文字列を複数の部分文字列に分割する Jul 25, 2023 pm 06:29 PM

PHP 関数「explode」を使用して文字列を複数の部分文字列に分割する PHP プログラミングでは、文字列を複数の部分文字列に分割する必要がある状況によく遭遇します。このとき、PHP には、この関数を簡単に実装できる非常に便利な関数「explode」が用意されています。 「explode」関数の構文は次のとおりです。 arrayexplode(string$delimiter,string$string[,in

PHPのexplode()関数とは何ですか? PHPのexplode()関数とは何ですか? Sep 04, 2023 pm 01:01 PM

この記事では、事前定義された組み込み PHP 関数である PHPExplode() 関数の使用方法を学びます。 explode関数は、「文字列を小さな内容に分割する」ために使用します。PHPのexplode関数を使用すると、文字列をブレークすることで小さな内容に分割できます。この区切り文字をデリミタと呼びます。 構文explode(delimiter, string, Number of elements) パラメータExplosion 関数は 3 つのパラメータを受け入れます, そのうち 2 つは必須で、1 つはオプションです. これら 3 つのパラメータについて説明しましょう. セパレータ この文字は文字列が分割される臨界点または点を指定します。つまり、この文字が文字列内で見つかるたびに、これは、配列内の 1 つの要素の終わりと別の要素の始まりを象徴します。

See all articles