2013-05-28 38 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.