explode関数とimplode関数は主に、パラメータを取得した後に特定の文字に従って文字列を分割したり、結果を変換したりするなど、文字列と配列の間の変換操作に使用されます。配列の文字を使用して文字列出力に結合します。これら 2 つの関数は PHP でよく使用されるため、その原理を理解する必要があります。
array explode ( string $delimiter, string $string, [ , $limit ] )
この関数は、文字列で構成される配列を返します。各要素は、次の文字列で区切られた string の部分文字列です。文字列 $delimiter を境界点として使用します。
limit
limit が設定されており、それが正の数の場合、返される配列には最大でもlimit要素と最後の要素が含まれます。この要素には文字列の残りの部分が含まれます。
limit が負の数の場合、最後の -$limit 要素を除くすべての要素を返します。
limit が 0 の場合は 1 として扱われます。
delimiter
delimiter が空の場合、関数は FALSE を返します。区切り文字が文字列内になく、limit が負の数の場合は、空の配列が返されます。
$str = 'hello,world,heiheihei,php';
まず制限が設定されていない場合を見てみましょう
$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);
2. 関数で使用されるローカル変数を作成します3. 制限値に従って文字列を区切るためにさまざまな関数を呼び出します
爆発のコア実装関数は 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(typename) と sizeof(expression) の 2 つの用途があります。パラメーターが typename、つまり型名の場合、sizeof は、それに対応するオブジェクトのサイズを返します。 type; パラメータが式expressionの場合、sizeofは式の戻り値の型に対応するオブジェクトのサイズを計算します。ここで、"" は式です。sizeof はコンパイル時にコンパイラによって "" に割り当てられる領域を計算します。このとき長さは 1 になります。strlen 関数では計算されません。 制限が設定されていない場合、制限のデフォルト値は LONG_MAX
です。 php.h ファイルでは、LONG_MAX は 2147483647L として定義されています。実装では、制限が 1 より大きい場合は php_explode
関数が呼び出され、制限が 0 より小さい場合はphp_explode_negative_limit 関数が呼び出されます。制限が 0 に等しい場合は 1 処理として扱われ、この時点で add_index_stringl 関数を呼び出して str を配列 return_value に追加します。 区切り文字を検索する場合、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 が呼び出されます。 区切り文字の位置を見つけたら、add_next_index_stringl
関数を呼び出して、区切られた文字列を戻り配列に挿入します。implode
string implode ( string $glue, array $pieces )string implode ( array $pieces )
implode 関数は 2 つのパラメータ命令を受け取ることができます。さらに、最初のパラメータが配列で 2 番目のパラメータが空の場合、2 番目のパラメータはデフォルト値 '' になります。この機能は、爆発の逆のプロセスとみなすことができます。
サンプルを実行します
$arr = array('hello', 'world');
$str = implode('-‘, $arr);// 输出"hello-world"
$str = implode($arr); // 输出"helloworld"$str = implode($arr, '-'); // 输出"hello-world"
3. 2 番目のパラメータが空でない場合、最初のパラメータが配列型の場合は 2 番目のパラメータを文字列型に変換し、それ以外の場合は 2 番目のパラメータが配列型の場合は最初のパラメータを変換します。文字列型にします。
4. php_implode 関数を呼び出して文字列を接続します。
implode 関数がパラメータを設定した後、最下層は文字列接続のために php_implode 関数を呼び出します。php_implode 関数の実行フローチャートは次のとおりです。
php_implode 関数のコアコード:
php_implode は配列の内容を 1 つずつ取得し、各要素の型を決定し、必要なデータ型変換を行った後、smart_str_appendl 関数を呼び出して値を追加します。返された文字列。最後に、文字列の後にターミネータを追加します。これは必要な操作であり、今後のプログラミングでは注意が必要です。
smart_str_appendl は、関数 Smart_str_appendl_ex のマクロ定義であり、memcpy を呼び出して文字列をコピーします。
現時点では、PHP ソース コードで一般的に使用される最適化と関数がさらにあります。これらについては、今後のソース コードの読み取りでゆっくりと説明します。
文体が限られ知識も浅いオリジナル記事です 記事内に間違いがあればご指摘ください。
この記事がお役に立ちましたら、クリックしておすすめしてください、ありがとうございます^_^
最後に、github の PHP ソース コードにさらに詳細な注釈を付けました。興味があれば、見てスターを付けてください。 PHP5.4のソースコードのアノテーション。追加された注釈は、コミット レコードを通じて表示できます。
著者がより良い記事を書くためのヒントを提供します。ありがとうございます!
著者に報酬を与える
支払い方法を選択してください
働いている人ハードルーキーパーソナルホームページ・私の記事・9・