為什么in_array(0, ['a', 'b', 'c'])返回true


在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

那么,如果用falsenull與字符串數組比較會如何呢?

它們是不會轉換成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

要想不相等,用嚴格比較。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM