2013-05-28 40 views
9

我有一個in_array函數的問題。測試下面的回報true如果needle爲0,in_array返回true

in_array(0, array('card', 'cash')) 

這怎麼可能,我怎麼能阻止它?

然而

in_array(null, array('card', 'cash')) 

回報false

+1

(INT)0(INT) '卡'? –

+4

LOOSE TYPING ...你正在比較數字與字符串,所以字符串被轉換爲數字,在這種情況下爲0,並且0 == 0.使用可選的STRICT參數 –

+0

謝謝@MarkBaker – hsz

回答

23

將任何不以數字開頭的字符串轉換爲數字會導致PHP中的0。這正是將0與某些字符串進行比較時發生的情況。有關如何完成各種類型之間的比較的詳細信息,請參見PHP docs

使用in_array的第三個參數(將其設置爲true)可以避免鬆散類型比較。

in_array(0, array('card', 'cash'), true) === false 
+0

好的,這就是我需要的答案。謝謝 ! – hsz

0

的回答可以是鑄造0串,這樣:

in_array((string) 0, array('card', 'cash')) 

記住0可以有一些變化,所以鑄造可以是有益的。

當你在 in_array 字符串比較
7

轉換而比較不兼容的數據類型 這意味着cashcard轉化爲0

這一切都是因爲類型轉換成int

您有2個選項

1。類型轉換上in_array

in_array(string(0), array('card', 'cash'))) === false; 

2。用third parametertrue將匹配該數據類型

in_array(0, array('card', 'cash'), true) === false; 

看到documentation

+0

OOPS!有點晚回答.. – alwaysLearn

2

可以防止它通過使用 '嚴格' 參數:

var_export(in_array(0, array('card', 'cash'), true)); 

var_export(in_array(null, array('card', 'cash'), true)); 

在這兩種情況下都返回false。

the docs to in_array()

If the third parameter strict is set to TRUE then the in_array() 
function will also check the types of the needle in the haystack.