首頁 >後端開發 >php教程 >淺談PHP原始碼十:關於array_keys,array_values函數

淺談PHP原始碼十:關於array_keys,array_values函數

不言
不言原創
2018-06-28 17:03:012216瀏覽

這篇文章主要介紹了關於淺談PHP源碼十:關於array_keys,array_values函數,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

新年的第一篇文章,先給各位朋友拜年

今天有空看了下程式碼,寫點東西,留作紀念!

array array_keys ( array input [, mixed search_value [, bool strict]] )

array_keys() 傳回 input 陣列中的數字或字串的鍵名。

如果指定了可選參數 search_value,則只傳回該值的鍵名。否則 input 數組中的所有鍵名都會被傳回。自 PHP 5 起,可以用 strict 參數來進行全等比較(===)。

array_keys 函數的實作在standard/array.c檔案的2416行PHP_FUNCTION(array_keys)

程式依照PHP一貫的風格,先判斷輸入是否正確,如果有第三個參數,則判斷大小的函數使用is_identical_function(預設為使用is_equal_function函數)
接著初始化傳回的數組,遍歷所給的數組,取每個元素的key值,賦值給傳回的數組,這個key值又分為數字和字串兩種,其中最主要的函數是hash操作函數zend_hash_get_current_key_ex(取當前元素的key值)

  ZEND_API int zend_hash_get_current_key_ex(HashTable *ht, char **str_index, uint *str_length, ulong *num_index, zend_bool duplicate, HashPosition *pos){
    Bucket *p; 
    p = pos ? (*pos) : ht->pInternalPointer; 
    IS_CONSISTENT(ht);     if (p) {
        if (p->nKeyLength) {    //    数字型的nKeyLength长度为0
            if (duplicate) {
                *str_index = estrndup(p->arKey, p->nKeyLength - 1);
            } else {
                *str_index = p->arKey;    //    /* arKey存储key名称(字符串类型的key)必须是最后一个成员,*/
            }
            if (str_length) {
                *str_length = p->nKeyLength;
            }
            return HASH_KEY_IS_STRING;
        } else {
            *num_index = p->h;    //    存储数字key值
            return HASH_KEY_IS_LONG;
        }
    }
    return HASH_KEY_NON_EXISTANT;}

對於此函數的理解主要是對bucket定義的了解

#與bucket相關的內容請移步http://www.php.cn/php-weizijiaocheng-405316.html

array array_values ( array input )

array_values() 回傳input 陣列中所有的值並給其建立數字索引。
array_values 函數與array_keys的函數實現基本類似,並且還少了一個zend_hash_get_current_key_ex操作和判斷值類型的操作,

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

淺談PHP源碼九:關於array_unshift, array_push的介紹

淺談PHP源碼八:關於array_pop, array_shift的介紹

#淺談PHP源碼七:關於nl2br, ltrim, rtrim, trim函數

#

以上是淺談PHP原始碼十:關於array_keys,array_values函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn