我试图在下一个场景中理解in_array
行为:
$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
var_dump(in_array(0, $arr));
in_array()
的返回值是布尔值true
。正如您所看到的,没有值等于0
,所以如果有人可以帮助我理解为什么函数会返回true?
答案 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 == FALSE
和0 === 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);