我试图了解in_array
下一个场景中的行为:
$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
var_dump(in_array(0, $arr));
的返回值为in_array()
boolean true
。如您所见,没有等于 的值0
,所以如果有人可以帮助我理解为什么该函数返回 true?
根据文档中的评论,这是一个已知问题。考虑以下示例:
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
整数时找到。
尝试在调用中添加第三个参数true
(严格模式)in_array
。
这是松散比较和类型杂耍的结果。
松散比较意味着 PHP在比较元素时 使用==
not 。不比较两个变量类型是否相等,只比较它们的值,而将确保它们在类型和值上匹配(例如比较和)。===
==
===
0 == FALSE
0 === 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)。这是在比较运算符文档中指定的:
如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式执行比较。
感谢您提出一个有趣的问题,让我进行了一些研究并学习了一些新东西!
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));
类型比较(第三个参数)需要更多的系统资源和更多的时间。只需这样做:
$x=0;
$result=in_array($x.'',array('ABC','BAC','12c','54'));
var_dump($result);