我试图理解下面这种情况下的in_array
行为:
$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
var_dump(in_array(0, $arr));
in_array()
函数的返回值是布尔型的 true
。正如你所看到的,没有任何值等于 0
,所以如果有人能帮我理解为什么这个函数返回 true,那就太好了。我试图理解下面这种情况下的in_array
行为:
$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
var_dump(in_array(0, $arr));
in_array()
函数的返回值是布尔型的 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
,表示在将Bye
转换为整数时找到了0
。
0 == 'string'
为 TRUE,这个回答会更好。 - erniearray_search
来查看 PHP 找到与 0
相等的值,果然它是第一个不以数字开头的字符串。 - Sampson尝试在 in_array
调用中添加第三个参数true
(严格模式)。
==
而不是 ===
。 ==
不会比较两个变量类型是否相等,只比较它们的值,而 ===
会确保它们在类型和值上匹配(例如比较 0 == FALSE
和 0 === FALSE
)。0 == 'Bye'
0 == 'Hey'
0 == 77
print (0 == 'Bye');
(int) 'string'
将等于0。 String conversion to numbers doc(重点添加)提供了具体的参考: 。
显然,整数类型优先于字符串类型(即它可以通过将int 0转换为字符串来执行比较,这将返回False)。 这在比较运算符文档中说明:该值由字符串的初始部分给出。如果字符串以有效的数字数据开头,则使用该值。 否则,该值将为0(零)。有效的数字数据是可选符号,后跟一个或多个数字(可选包含小数点),后跟可选指数。指数是“e”或“E”,后跟一个或多个数字。
感谢一个有趣的问题,让我做了一些研究并学到了新东西!如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字,并按数字执行比较。
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);