淺談PHP源碼十八:關於array_diff_key,array_diff_assoc,array_udiff_assoc 函數

來源:互聯網
上載者:User
這篇文章主要介紹了關於淺談PHP源碼十八:關於array_diff_key,array_diff_assoc,array_udiff_assoc 函數,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

淺談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,即使用者自訂的函數

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.