爲何in_array(0, ['a', 'b', 'c'])返回true

在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呢?字符串

1 類型轉換

緣由就在於,在比較前,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

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。

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

 

參考資料:

  1. Php, in_array, 0 value

  2. PHP in_array() / array_search() odd behaviour

  3. String conversion to numbers

Post navigati

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

相關文章
相關標籤/搜索