2010-03-19 70 views
12

我最近有一個奇怪的問題,最近我無法理解in_array。 例如關於in_array的一個問題

$a = array('a','b','c'); 
$b = array(1,2,3); 

if (in_array(0,$a)) 
{ 
    echo "a bingo!\n"; 
} 
else 
{ 
    echo "a miss!\n"; 
} 

if (in_array(0,$b)) 
{ 
    echo "b bingo!\n"; 
} 
else 
{ 
    echo "b miss!\n"; 
} 

我跑在我的燈,並得到了

a bingo! 
b miss! 

我閱讀手冊,並設置第三個參數作爲$stricttrue,那麼它曾作爲expected.But這意味着我總是需要請使用in_array將嚴格的參數設置爲true?建議將不勝感激。

問候

+0

Clear.Thanks all。 – Young 2010-03-19 12:01:53

回答

17

這意味着你必須當你想比較不僅比較值到第三個參數設置爲true,而且類型

否則,在進行比較時存在類型轉換 - 例如參見String conversion to numbers

由於事實上,in_array沒有和嚴格的只是,你將有=====之間相同差異 - 見Comparison Operators


大多數情況下,這種轉換工作正常......但不是在你試圖將0與以字母開頭的字符串進行比較的情況下:字符串被轉換爲數字, 0作爲值。

1

在第一個例子中,數組$ a中的每個值在轉換爲數字時都是0.這就是爲什麼你的第一個例子會產生「賓果」。

如果您知道您依賴於隱式轉換,或者您的數據類型相同(例如搜索字符串數組中的字符串),則不必使用strict參數。否則,應該使用strict參數,在比較必須是相同類型的兩個值時,應該使用===而不是==。

6

in_array的「默認」模式是使用loose comparison,比如== comparison operator。這意味着0相比是這樣的:

如果你比較了一些用細繩或比較涉及數字字符串,那麼每個:

var_dump(0 == 'a'); // bool(true) 
var_dump(0 == 'b'); // bool(true) 
var_dump(0 == 'c'); // bool(true) 

現在loose comparison operator ==之前確實比較值使用string conversion to integer字符串被轉換爲數字,數值進行比較。

而且'a''b''c'都轉換爲0

var_dump((int) 'a'); // int(0) 
var_dump((int) 'b'); // int(0) 
var_dump((int) 'b'); // int(0) 

但在嚴格的模式下使用in_array時(設爲第三個參數爲),一個strict comparison (===)完成,這意味着兩值和類型必須相等:

var_dump(0 === 'a'); // bool(false) 
var_dump(0 === 'b'); // bool(false) 
var_dump(0 === 'c'); // bool(false) 

因此wh在嚴格模式中使用in_array,就可以得到期望的結果:

var_dump(in_array(0, $a, true)); // bool(false)