ホームページ  >  記事  >  バックエンド開発  >  PHP ソース コードの簡単な説明 15: array_walk 関数について

PHP ソース コードの簡単な説明 15: array_walk 関数について

不言
不言オリジナル
2018-06-28 17:28:331508ブラウズ

この記事では、主に PHP ソース コードに関する第 15 章を紹介します。array_walk 関数に関しては、必要な友人に参照してもらえるように共有します。 PHP ソース コードの第 10 章 5: array_walk 関数について

array_walk

(PHP 3 >= 3.0.3, PHP 4, PHP 5)

array_walk — ユーザー関数の適用array の各メンバーに

Description

bool array_walk (array &array, callback funcname [,mixed userdata] )

成功した場合は TRUE を返し、失敗した場合は FALSE を返します。

ユーザー定義関数 funcname を配列 array 内の各セルに適用します。通常、 funcname は 2 つのパラメータを受け入れます。配列パラメータの値が最初のパラメータとして使用され、キー名が 2 番目のパラメータとして使用されます。オプションの引数 userdata が指定されている場合、それはコールバック funcname の 3 番目の引数として渡されます。

funcname 関数に指定されたパラメーターよりも多くのパラメーターが必要な場合、array_walk() が funcname を呼び出すたびに E_WARNING レベルのエラーが生成されます。これらの警告は、array_walk() 呼び出しの前に PHP のエラー演算子 @ を付けるか、error_reporting() を使用することで抑制できます。
注: funcname が配列内の値に直接作用する必要がある場合は、funcname の最初のパラメーターを参照として指定します。したがって、これらのセルを変更すると、元の配列自体も変更されます。
注: キー名とユーザーデータを funcname に渡す機能は、PHP 4.0 の新機能です。

array_walk() は、配列の内部配列ポインタの影響を受けません。 array_walk() は、ポインタの位置に関係なく、配列全体を調べます。 (これは、プログラムが配列トラバーサルの開始時に配列が配置されているハッシュ テーブルのポインターをリセットするためです。)

ユーザーはコールバック関数で配列自体を変更すべきではありません。たとえば、ユニットの追加/削除、ユニットの設定解除などです。 array_walk() が動作する配列が変更された場合、この関数の動作は未定義で予測できません。

プログラム実装の説明:
拡張機能の最後の呼び出しは関数 php_array_walk です:

   static int php_array_walk(HashTable *target_hash, zval **userdata, int recursive TSRMLS_DC)

再帰 == 0 の場合、この関数は array_walk 関数の実装です

再帰 = の場合= 1、この関数は array_walk_recursive 関数の実装です

ソース コードでは、プログラムは配列全体を走査し、配列要素ごとに、渡された関数に基づいて関連する関数呼び出しを行います

関数呼び出しは次のとおりです。

fci.size = sizeof(fci);
            fci.function_table = EG(function_table);
            fci.function_name = *BG(array_walk_func_name);
            fci.symbol_table = NULL;
            fci.object_pp = NULL;
            fci.retval_ptr_ptr = &retval_ptr;
            fci.param_count = userdata ? 3 : 2;
            fci.params = args;
            fci.no_separation = 0;             /* Call the userland function */
            if (zend_call_function(&fci, &array_walk_fci_cache TSRMLS_CC) == SUCCESS) {

この関数呼び出しでは構造体が使用されています。コメントは次のとおりです。

 typedef struct _zend_fcall_info {
 size_t size;    //    整个结构体的长度,等于sizeof(此函数体的变量)
 HashTable *function_table;    //    executor_globals.function_table
 zval *function_name;    //    函数名 
 HashTable *symbol_table;
 zval **retval_ptr_ptr;        //    函数的返回值
 zend_uint param_count;    //    参数个数
 zval ***params;            //    所调用函数的参数
 zval **object_pp;        //    用于对象的方法调用时,存储对象
 zend_bool no_separation;    //    是否清空参数所在的栈} zend_fcall_info;

上記は個人的なメモです。間違いがある場合はご了承ください。 、訂正してください!

EOF

以上がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

PHP ソース コード 14 についての簡単な説明: array_combine 関数について


についての簡単な説明PHP ソース コード 13: array_change_key_case と array_chunk の概要


PHP ソース コード 12 の簡単な説明: return_value 戻り値

以上がPHP ソース コードの簡単な説明 15: array_walk 関数についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。