この記事では、主に PHP ソース コードの第 18 章を紹介します。array_diff_key、array_diff_assoc、array_udiff_assoc 関数について説明します。これらの関数は、必要なときに参照できるようになりました。 PHP ソースコードについて 18: array_diff_key、array_diff_assoc、array_udiff_assoc 関数について
[array_diff_key]
(PHP 5 >= 5.1.0RC1)
array_diff_key — キー名の比較を使用して、 array Difference setDescription
array array_diff_key (array array1, array array2 [, array ...])
array_diff_key() は、array1 内のすべての出現を含む配列を返します。キーのは他のパラメータ配列には現れません。関係は変わらないことに注意してください。
【array_diff_assoc】
(PHP 4 >= 4.3.0, PHP 5)
array_diff_assoc — インデックスチェックを使用して配列の差分を計算します説明
array array_diff_assoc ( array array1, array array2 [, array ...] )
array_diff_assoc() array1 のすべての値を含み、他のパラメーター配列には含まれない配列を返します。 array_diff() とは異なり、キー名も比較に使用されることに注意してください。
これら 3 つの関数がまとめられている理由は、呼び出される最後の関数が 1 つの関数であるためです: php_array_diff_key
[array_diff_uassoc]
(PHP 5)
Description
array array_diff_uassoc (array array1, array array2 [, array ..., callback key_compare_func] )
array_diff_uassoc( ) は、array1 内の他のパラメーター配列にないすべての値を含む配列を返します。
これら 3 つの関数が php-array_diff_key を呼び出す方法は次のとおりです。
array_diff_key: php_array_diff_key(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_COMP_DATA_NONE);array_diff_assoc: php_array_diff_key(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_COMP_DATA_INTERNAL);array_udiff_assoc: php_array_diff_key(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_COMP_DATA_USER);
#define INTERNAL_FUNCTION_PARAM_PASSTHRU ht, return_value, return_value_ptr, this_ptr, return_value_used TSRMLS_CC #define DIFF_COMP_DATA_NONE -1#define DIFF_COMP_DATA_INTERNAL 0#define DIFF_COMP_DATA_USER 1
php_array_diff_key 関数は、最初に次のようにする必要があります。受信した data_compare_type (つまり、上で定義した 3 つのマクロ) に基づいて、使用する比較関数を決定し、最初の配列を走査し、各要素を他の配列と比較して、他の数値が存在するかどうかを確認します。
存在する場合は、それらを削除してください
For この関数のソース コードに関する説明:for (i = 0; i < argc; i++) { if (Z_TYPE_PP(args[i]) != IS_ARRAY) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d is not an array", i + 1); RETVAL_NULL(); goto out; // goto语句,这个貌似一般是高手用的,嘿嘿 } } array_init(return_value); // 返回数组初始化,初始化存储此数组的Hash Table for (p = Z_ARRVAL_PP(args[0])->pListHead; p != NULL; p = p->pListNext) { // 遍历第一个参数包含的双向链表 if (p->nKeyLength == 0) { // 数组索引为数字 ok = 1; for (i = 1; i < argc; i++) { // 对其它的数组进行判断 if (zend_hash_index_find(Z_ARRVAL_PP(args[i]), p->h, (void**)&data) == SUCCESS && (!diff_data_compare_func || diff_data_compare_func((zval**)p->pData, data TSRMLS_CC) == 0)) { ok = 0; break; } } if (ok) { 在第一个数组中,不在其它数组中 (*((zval**)p->pData))->refcount++; zend_hash_index_update(Z_ARRVAL_P(return_value), p->h, p->pData, sizeof(zval*), NULL); } } else { // 索引为字符串 ok = 1; for (i = 1; i < argc; i++) { if (zend_hash_quick_find(Z_ARRVAL_PP(args[i]), p->arKey, p->nKeyLength, p->h, (void**)&data) == SUCCESS && (!diff_data_compare_func || diff_data_compare_func((zval**)p->pData, data TSRMLS_CC) == 0)) { ok = 0; break; } } if (ok) { (*((zval**)p->pData))->refcount++; zend_hash_quick_update(Z_ARRVAL_P(return_value), p->arKey, p->nKeyLength, p->h, p->pData, sizeof(zval*), NULL); } } }
DIFF_COMP_DATA_NONE パラメータは NULL に対応します。つまり、比較は行われません。インデックス検索を使用します。
DIFF_COMP_DATA_INTERNAL このパラメータは、zval_compare に対応します。つまり、インデックスと値の両方が比較されます。DIFF_COMP_DATA_USER パラメータは、ユーザー定義関数である zval_user_compare に対応します。
# 以上がこの記事の全内容です。皆様の学習に役立つことを願っています。その他の関連コンテンツについては、PHP 中国語 Web サイトに注目してください。
関連する推奨事項:
PHP ソース コードについての簡単な説明 16: array_count_values 関数について
PHP ソース コードについての簡単な説明 15: array_walk 関数について
以上がPHP ソース コードの簡単な説明 18: array_diff_key、array_diff_assoc、array_udiff_assoc 関数についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。