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

PHP ソース コードの簡単な説明 18: array_diff_key、array_diff_assoc、array_udiff_assoc 関数について

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

この記事では、主に 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 set

Description

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)

array_diff_uassoc — ユーザーを使用します。提供されたコールバック関数は、インデックス チェックを実行して、array の差集合を計算します。

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 ソース コード 17 についての簡単な説明: array_diff、array_udiff、array_diff_ukey、array_diff_uassoc、array_udiff_uassoc の概要

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

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

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

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