Maison  >  Article  >  développement back-end  >  Une brève discussion du code source PHP 18 : à propos des fonctions array_diff_key, array_diff_assoc, array_udiff_assoc

Une brève discussion du code source PHP 18 : à propos des fonctions array_diff_key, array_diff_assoc, array_udiff_assoc

不言
不言original
2018-06-28 17:37:492402parcourir

Cet article présente principalement le code source PHP 18 : À propos des fonctions array_diff_key, array_diff_assoc, array_udiff_assoc, qui ont une certaine valeur de référence. Maintenant, je les partage avec vous. Les amis dans le besoin peuvent s'y référer

En parlant de. Code source PHP 18 : À propos des fonctions array_diff_key, array_diff_assoc et array_udiff_assoc

[array_diff_key]

(PHP 5 >= 5.1.0RC1)
array_diff_key — Utiliser la comparaison des noms de clés pour calculer la différence de tableau set
Description

array array_diff_key ( array array1, array array2 [, array ...] )

array_diff_key() renvoie un tableau qui inclut toutes les occurrences dans array1 Mais la valeur du La clé n'apparaît dans aucun autre tableau de paramètres. Notez que la relation reste inchangée.

[array_diff_assoc]

(PHP 4 >= 4.3.0, PHP 5)
array_diff_assoc — Calcule la différence des tableaux avec vérification d'index
Description

array array_diff_assoc (array array1, array array2 [, array ...] )

array_diff_assoc() renvoie un tableau qui inclut toutes les valeurs de array1 mais pas dans aucun autre tableau de paramètres. Notez que contrairement à array_diff(), les noms de clés sont également utilisés à des fins de comparaison.

La raison pour laquelle ces trois fonctions sont réunies est que la dernière fonction qu'elles appellent est une seule fonction : php_array_diff_key
[array_diff_uassoc]

(PHP 5)
array_diff_uassoc — Utiliser l'utilisateur La fonction de rappel fournie effectue une vérification d'index pour calculer l'ensemble des différences du tableau
Description

array array_diff_uassoc ( array array1, array array2 [, array ..., callback key_compare_func] )

array_diff_uassoc( ) renvoie un tableau contenant toutes les valeurs du tableau1 qui ne figurent dans aucun autre tableau de paramètres.

La façon dont ces trois fonctions appellent php-array_diff_key est la suivante :

  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);

La définition macro des paramètres est la suivante :

  #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

La fonction php_array_diff_key doit d'abord passer data_compare_type (c'est-à-dire les trois macros définies ci-dessus), déterminer la fonction de comparaison à utiliser, puis parcourir le premier tableau, comparer chaque élément avec d'autres tableaux pour voir si d'autres nombres existent

S'ils existent, supprimez-les
Faites une note explicative sur le code source de cette fonction :

 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);
            }
        }
    }

A propos de la fonction de comparaison :

Le paramètre DIFF_COMP_DATA_NONE correspond à NULL, c'est-à-dire qu'il y a Il n'y a pas de comparaison. Utilisez la recherche par index pour le trouver. C'est tout
Le paramètre DIFF_COMP_DATA_INTERNAL correspond à zval_compare, c'est-à-dire que l'index et la valeur seront comparés
Le paramètre DIFF_COMP_DATA_USER correspond à zval_user_compare, qui est un utilisateur- fonction définie

Ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'apprentissage de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Une brève discussion du code source PHP dix-sept : Introduction à array_diff, array_udiff, array_diff_ukey, array_diff_uassoc, array_udiff_uassoc

Une brève discussion sur le code source PHP 16 : à propos de la fonction array_count_values ​​​​

Une brève discussion sur le code source PHP 15 : à propos de la fonction array_walk

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn