Php,in_array,0值

时间:2012-12-12 19:01:43

标签: php arrays

我试图在下一个场景中理解in_array行为:

$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
var_dump(in_array(0, $arr));

in_array()的返回值是布尔值true。正如您所看到的,没有值等于0,所以如果有人可以帮助我理解为什么函数会返回true?

5 个答案:

答案 0 :(得分:55)

根据the documentation中的评论,这是一个已知问题。请考虑以下示例:

in_array(0, array(42));      // FALSE
in_array(0, array('42'));    // FALSE
in_array(0, array('Foo'));   // TRUE

为了避免这种情况,请提供第三个参数true,将比较置于严格模式中,这不仅会比较值,还会比较类型:

var_dump(in_array(0, $arr, true));

其他解决方法不需要将每个检查都置于严格模式下:

in_array($value, $my_array, empty($value) && $value !== '0');

但为什么?

所有这一切背后的原因可能是string-to-number conversions。如果我们尝试从“再见”中获取一个数字,我们会得到0,这是我们要求查找的值。

echo intval("Bye"); // 0

要确认这一点,我们可以使用array_search查找与匹配值相关联的密钥:

$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
echo array_search(0, $arr);

在此,返回的密钥为2,表示在0到整数的转换中找到了Bye

答案 1 :(得分:7)

尝试在true来电中添加第三个参数in_array(严格模式)。

答案 2 :(得分:3)

这是松散比较和type juggling的结果。

松散的比较意味着PHP在比较元素时使用的是==而不是=====没有比较两个变量类型相等,只是它们的值,而===将确保它们在类型和值上匹配(例如,比较0 == FALSE0 === FALSE) 。

所以,基本上,你的in_array函数正在检查:

0 == 'Bye'
0 == 'Hey'
0 == 77

请注意,由于您创建阵列的方式,52会丢失。

所以,请注意,如果你这样做:

print (0 == 'Bye');

你会得到1.显然,PHP是type juggling'再见'为0,这与将字符串转换为int时会发生的情况相同,例如: (int) 'string'将等于0.具体参考the String conversion to numbers doc(强调增加):

  

该值由字符串的初始部分给出。如果是字符串   从有效的数字数据开始,这将是使用的值。   否则,该值将为0(零)。有效的数字数据是   可选符号,后跟一个或多个数字(可选地包含一个   小数点),后跟可选的指数。指数是一个   'e'或'E'后跟一个或多个数字。

显然,整数类型优先于字符串类型(即,通过将int 0转换为字符串,然后返回False,可以很容易地进行比较)。这在comparison operators doc

中指定
  

如果您将数字与字符串进行比较或比较涉及   数字字符串,然后每个字符串转换为一个数字和   比较用数字表示。

感谢一个有趣的问题让我做了一些研究并学到了新的知识!

答案 3 :(得分:1)

in_array应该用于索引数组([0],[1],[2]等),而不是你定义的字典(键值存储)。

如果要检查数组$ arr是否包含'0',请尝试使用PHP函数array_key_exists - http://php.net/manual/en/function.array-key-exists.php

var_dump(array_key_exists(0, $arr));

答案 4 :(得分:0)

类型比较(第三个参数)需要更多的系统资源和更多的时间。 只需这样做:

$x=0;
$result=in_array($x.'',array('ABC','BAC','12c','54'));
var_dump($result);