在PHP中,數據會自動轉換類型后進行比較。
所以會發現一個奇怪的現象,就是:
in_array(0, ['a', 'b', 'c']) // 返回bool(true),也就相當於數組中有0 array_search(0, ['a', 'b', 'c']) // 返回int(0),也就是第一個值的下標 0 == 'abc' // 返回bool(true),也就相當於相等
這兩個表達式都返回true。
直觀上看,0沒有在數組['a', 'b', 'c']中,也不會等於abc這個字符串。
那怎么會返回true呢?
1 類型轉換
原因就在於,比較時的PHP做了類型轉換。
PHP官網上的說明:http://php.net/manual/en/language.types.string.php#language.types.string.conversion
也就是在比較前,string類型的數據會轉換成int型,然后再比較。
而如果string類型數據第一個字符不是數字,就會轉換成0。例如,
echo intval("Bye"); // 輸出0
因為in_array()和array_search()默認都是松散比較,相當於==,所以就得到true。
2 嚴格比較
那如何得到false呢?
就是用嚴格比較,如下,
in_array(0, ['a', 'b', 'c'], true) // 返回false array_search(0, ['a', 'b', 'c'], true) // 返回false 0 === 'abc' // 返回false
強制做類型比較,這樣就能拿到精確的結果。
3 false和null
那么,如果用false和null與字符串數組比較會如何呢?
它們是不會轉換成int型的,所以結果是這樣的:
in_array(null, ['a', 'b', 'c']) //返回false in_array(false, ['a', 'b', 'c']) //返回false
4 數組中有true
還有另外一個看起來比較奇怪的現象:
in_array('a', [true, 'b', 'c']) // 返回bool(true),相當於數組里面有字符'a' array_search('a', [true, 'b', 'c']) // 返回int(0),相當於找到了字符'a'
這是為什么呢?
說起來也很好理解,松散比較下,任何string都等於true。
要想不相等,用嚴格比較。
