28

我试图了解in_array下一个场景中的行为:

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

的返回值为in_array()boolean true。如您所见,没有等于 的值0,所以如果有人可以帮助我理解为什么该函数返回 true?

4

5 回答 5

63

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

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');

但为什么?

这一切背后的原因很可能是字符串到数字的转换。如果我们尝试从“Bye”中获取一个数字,我们会得到0,这是我们要求查找的值。

echo intval("Bye"); // 0

为了确认这一点,我们可以使用查找与匹配array_search关联的键:

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

在此,返回的键是2,意思0是在转换为Bye整数时找到。

于 2012-12-12T19:06:22.523 回答
9

尝试在调用中添加第三个参数true(严格模式)in_array

于 2012-12-12T19:05:35.577 回答
4

这是松散比较和类型杂耍的结果。

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

因此,基本上,您的 in_array 函数正在检查:

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

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

因此,请注意,如果您这样做:

print (0 == 'Bye');

您将得到 1。显然,PHP将“再见”类型转换为 0,这与将字符串转换为 int 时会发生的情况相同,例如(int) 'string'将等于 0。从字符串转换为数字 doc 的具体参考(重点补充):

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

显然,整数类型优先于字符串类型(即,它可以通过将 int 0 转换为字符串来轻松进行比较,然后返回 False)。这是在比较运算符文档中指定的:

如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式执行比较。

感谢您提出一个有趣的问题,让我进行了一些研究并学习了一些新东西!

于 2012-12-12T19:16:26.487 回答
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));
于 2012-12-12T19:07:12.770 回答
0

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

$x=0;
$result=in_array($x.'',array('ABC','BAC','12c','54'));
var_dump($result);
于 2019-09-18T20:43:50.997 回答