淺談PHP源碼十八:關于array_diff_key,array_diff_assoc,array_udiff_assoc 函數
【array_diff_key】
(PHP 5 = 5.1.0RC1)
array_diff_key — 使用鍵名比較計算數組的差集
說明
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() 不同的是鍵名也用于比較。
之所以把這三個函數放在一起是因為他們調用的最后是一個函數:php_array_diff_key
【array_diff_uassoc】
(PHP 5)
array_diff_uassoc — 用用戶提供的回調函數做索引檢查來計算數組的差集
說明
array array_diff_uassoc ( array array1, array array2 [, array ..., callback key_compare_func] )
array_diff_uassoc() 返回一個數組,該數組包括了所有在 array1 中但是不在任何其它參數數組中的值。
這三個函數調用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(即上面定義的三個宏),判斷所要使用的比較函數,然后遍歷第一個數組,針對每一個元素與其它數組比較,看其它數字是否存在
如果存在則刪
針對此函數的源碼做一個注釋性的說明:
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 !
相關推薦:
淺談PHP源碼十七:關于array_diff,array_udiff,array_diff_ukey,array_diff_uassoc,array_udiff_uassoc的介紹
淺談PHP源碼十六:關于array_count_values函數
淺談PHP源碼十五:關于array_walk函數
以上就是淺談PHP源碼十八:關于array_diff_key,array_diff_assoc,array_udiff_assoc 函數的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答