首頁  >  文章  >  後端開發  >  淺談PHP原始碼十一:關於 array_key_exists,in_array的介紹

淺談PHP原始碼十一:關於 array_key_exists,in_array的介紹

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

這篇文章主要介紹了關於淺談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中文網其他相關文章!

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