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 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!