在PHP中,數據會自動轉換類型後再進行比較。php
這樣可能會致使一些費解的現象:數組
in_array(0, ['a', 'b', 'c'])
// 返回bool(true),也就至關於數組中有0
array_search(0, ['a', 'b', 'c'])
// 返回int(0),也就是第一個值的下標
0 == 'abc'
// 返回bool(true),也就至關於相等
這兩個表達式都返回true。ide
直觀上看,0沒有在數組['a', 'b', 'c']中,也不會等於abc這個字符串。.net
那怎麼會返回true呢?字符串
緣由就在於,在比較前,PHP作了類型轉換。string
PHP官網上的說明:http://php.net/manual/en/language.types.string.php#language.types.string.conversionit
string類型的數據會轉換成int型,而後再比較。io
而若是string類型數據第一個字符不是數字,就會轉換成0。例如,class
echo intval("Bye"); // 輸出0
in_array()和array_search()默認都是鬆散比較,至關於==,因此就獲得true。im
那如何獲得false呢?
用嚴格比較,以下,
in_array(0, ['a', 'b', 'c'], true)
// 返回false
array_search(0, ['a', 'b', 'c'], true)
// 返回false
0 === 'abc'
// 返回false
強制作類型比較,這樣就能拿到精確的結果。
那麼,若是用false和null與字符串數組比較會如何呢?
它們是不會轉換成int型的,因此結果是這樣的:
in_array(null, ['a', 'b', 'c'])
//返回false
in_array(false, ['a', 'b', 'c'])
//返回false
另一個看起來比較奇怪的現象:
in_array('a', [true, 'b', 'c'])
// 返回bool(true),至關於數組裏面有字符'a'
array_search('a', [true, 'b', 'c'])
// 返回int(0),至關於找到了字符'a'
這是爲何呢?
提及來也很好理解,鬆散比較下,任何string都等於true。
要想不相等,老辦法,用嚴格比較。
參考資料:
Php, in_array, 0 value
PHP in_array() / array_search() odd behaviour
String conversion to numbers