這篇文章主要介紹了關於淺談PHP源碼十一:關於array_key_exists,in_array的介紹,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
#淺談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:
==> 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中文網其他相關文章!