2013-04-30 20 views
0

爲什麼'[email protected]'被認爲是in_array數組(0,1,2,3,4)?爲什麼array(0,1,2,3,4)中的'[email protected]'?

$email = '[email protected]'; 
$validValues = array(0,1,2,4); 
var_dump(in_array($email, $validValues));  // bool(true) 
var_dump(in_array($email, $validValues, true)); // bool(false) 

那麼這裏發生了什麼?

+0

荒誕!不是==&===已經不那麼令人困惑了,PHP認爲我們也可以在數組中做到這一點。一個人非常愚蠢的選擇這個作爲默認行爲。 – Shubham 2013-04-30 17:08:48

+0

在我看來,'$ strict'參數的默認值應該是真的(並且可以有意使用混淆的強制/轉換) – 2013-04-30 17:22:23

回答

4

因爲0 == '[email protected]'(該字符串被轉換爲數字),但是0 !== '[email protected]'

==!=符執行類型強制,並且將轉換一個操作數,以匹配其它的類型。如果操作數的類型不完全相同,則操作數===!==將返回假操作數的值相等。

in_array()的第三個參數確定使用哪種類型的相等性測試。

+0

我只是想要嘗試每個鍵。所以這個演員的表現與我預期的完全相反......我期望'? '[email protected]'==(string)0' – 2013-04-30 17:04:05

+1

@MikeGraf這就是爲什麼我從不在PHP中使用'=='或'!='的原因。他們比他們有用更混亂。 – cdhowie 2013-04-30 17:04:27

+0

(我可以在11分鐘內得到正確答案) – 2013-04-30 17:05:32

0

in_array的第三個屬性決定測試是否應該嚴格(===)。在其他情況下PHP的類型轉換踢的......

+0

@cdhowie選擇答案,因爲他還解釋了爲什麼'[email protected]'== 0。 – 2013-04-30 17:06:56

+0

@MikeGraf:我認爲他是最好的解釋:) + 1-ed it – raidenace 2013-04-30 17:09:16

0
in_array($value, $array, $strict); 

固有的怪癖是in_array功能的簽名。 $strict,如果爲true,則檢查===,如果僅爲==則爲false。

當你做'[email protected]' == 0你會有結果。

所以當你執行你的第一個檢查時,它認爲$email == 0並且返回true。

相關問題