1. 程式人生 > >【in_array和array_search】PHP中的in_array和array_search【原創】

【in_array和array_search】PHP中的in_array和array_search【原創】

in_array有個地方需要注意一下,見以下程式碼:
$array = ['a', 'b', 'c'];

var_dump(in_array(0, $array));      // 返回bool(true),也就相當於陣列中有0	

var_dump(in_array(0, $array, true));      // 返回bool(false),也就相當於陣列中無0		

var_dump(array_search(0, $array));  // 返回int(0),也就是第一個值的下標

var_dump(array_search(0, $array, true));  // 返回false

manual的說明如下:
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )


引數  needle     待搜尋的值。 haystack     待搜尋的陣列。 strict     如果第三個引數 strict 的值為 TRUE 則 in_array() 函式還會檢查 needle 的型別是否和 haystack 中的相同。 原因:在比較前,PHP強制轉換了型別 在PHP中,當string的型別的資料和int型別的資料進行對比的時候,會強制把string轉換為int,而如果string的型別資料第一個數字,就會被轉換為0,即:
echo (int)'aaa';
echo intval('aaa');

會輸出0,所以就相當於判斷in_array(0, [0, 0, 0]);返回true擴充套件:還有一種情況是這樣:
in_array('a', [true, 'b', 'c'])       // 返回bool(true),相當於數組裡面有字元'a'
array_search('a', [true, 'b', 'c'])   // 返回int(0),相當於找到了字元'a'

也是同樣的道理,string型別轉換為boolen值的話是true。 總結:所以需要用in_array或者是array_search的時候,儘量把第三個引數設定為true,另外呢,如果設定第三個引數為true的話,那麼在查詢的時候,會直接對比型別和值,避免了PHP的自動轉換型別,效能會快很多。不過呢,陣列查詢呢,還是儘量使用isset函式或者是array_key_exists函式來代替。 注意:我在Windows和Linux裡面測試了in_array和array_search的耗時,in_array和array_search的耗時速度基本差不多,差別並不大,另外,如果這兩個函式第三個引數為true的話,確實是比不加第三個引數或者是第三個引數設定為false的快,快1倍差不多。