這篇文章主要介紹了關於淺談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操作和判斷實值型別的操作,
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!