淺談PHP源碼十一:關于 array_key_exists,in_array的介紹
array_key_exists
(PHP 4 = 4.1.0, PHP 5)
array_key_exists — 檢查給定的鍵名或索引是否存在于數組中
說明
bool array_key_exists ( mixed key, array search )
array_key_exists() 在給定的 key 存在于數組中時返回 TRUE。key 可以是任何能作為數組索引的值。array_key_exists() 也可用于對象。
程序會針對三種不同的類型分別處理,
1、字符串: case IS_STRING:
== html' target='_blank'>static inline int zend_symtable_exists(HashTable *ht, char *arKey, uint nKeyLength)
== #define HANDLE_NUMERIC(key, length, func) // 將處理字符串類型的key值,如果是數字則取func值所得的值,否則轉下一步
== ZEND_API int zend_hash_exists(HashTable *ht, char *arKey, uint nKeyLength) // 判斷在數組所在的hashtable中是否存在此字符串
2、數字:case IS_LONG:
== ZEND_API int zend_hash_index_exists(HashTable *ht, ulong h) // 此函數取索引值為h的bucket,如果此索引存在多個值,則遍歷取key值為數字型的bucket
3、字值:case IS_NULL:
== zend_hash_exists(HASH_OF(*array), “”, 1) // 判斷數組所在hashtable中是否存在空值
以上的函數如此存在則:RETURN_TRUE;否則:RETURN_FALSE;
in_array
(PHP 4, PHP 5)
in_array — 檢查數組中是否存在某個值
說明
bool in_array ( mixed needle, array haystack [, bool strict] )
在 haystack 中搜索 needle,如果找到則返回 TRUE,否則返回 FALSE。
如果第三個參數 strict 的值為 TRUE 則 in_array() 函數還會檢查 needle 的類型是否和 haystack 中的相同。
注意: 如果 needle 是字符串,則比較是區分大小寫的。
注意: 在 PHP 版本 4.2.0 之前,needle 不允許是一個數組。
程序實現非常簡單,遍歷數組所在的hash table,依據strict選擇比較函數,如果為真則使用is_identical_function,否則為is_equal_function,strict的默認值為FALSE
然后使用此函數判斷是否相等,如果存在則直接返回TRUE
但是在程序中我們有看到 target_hash = HASH_OF(*array);
宏源碼如下:
#define HASH_OF(p) (Z_TYPE_P(p)==IS_ARRAY ? Z_ARRVAL_P(p) : ((Z_TYPE_P(p)==IS_OBJECT ? Z_OBJ_HT_P(p)- get_properties((p) TSRMLS_CC) : NULL)))
此方法的作用是判斷是否是數組,如果是數組返回數組,否則判斷是否是對象,如果為對象,則返回對象的所有屬性,否則返回NULL
但是在前面又有判斷參數是否為數組的判斷,如下代碼:
if (Z_TYPE_PP(array) != IS_ARRAY) { php_error_docref(NULL TSRMLS_CC, E_WARNING, Wrong datatype for second argument RETURN_FALSE; }
難道是歷史遺留問題?
奇怪!
EOF
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
相關推薦:
淺談PHP源碼十:關于array_keys,array_values函數
淺談PHP源碼九:關于array_unshift, array_push的介紹
淺談PHP源碼八:關于array_pop, array_shift的介紹
以上就是淺談PHP源碼十一:關于 array_key_exists,in_array的介紹的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答