我试图在phptester.net上测试一些东西并遇到了一些我不知道的东西。我不确定为什么使用PHP 7.0时,以下某些陈述是正确的。
<?php
$arr = array('a', 'b', 'c');
var_dump(in_array('a', $arr)); // bool(true)
var_dump(in_array(false, $arr)); // bool(false)
var_dump(in_array(null, $arr)); // bool(false)
var_dump(in_array(0, $arr)); // bool(true) ----> why?
var_dump(in_array(1, $arr)); // bool(false)
var_dump(in_array(true, $arr)); // bool(true) ----> why?
为in_array()
,为什么是“为什么”?评论线是真的吗?
in_array
的第三个参数,默认为FALSE
。如果您没有明确指定为TRUE
,则in_array
不会检查类型。
在整数上下文中,非数字字符串为零,因此没有严格检查,'a'
,'b'
和'c'
是0
s,所以0
在该数组中。
类似地,在布尔上下文中,非空字符串是TRUE
,因此在该数组中也可以找到TRUE
。
根据php手册(我建议你阅读)in_array
除非设置严格,否则使用松散比较搜索干草堆的针。
这里的主要词是宽松的比较。
所以,php执行一些类型转换和比较值。
根据比较表here,我们可以用你的案例解释这里做了什么:
var_dump(in_array(0, $arr));
在这里,您可以比较number
和string
。手册说在这种情况下
将字符串和资源转换为数字,通常的数学
所以,第一个值'a'
被转换为0.因为这个字符串中没有数字。 0 == 0
,返回true。
下一个:
var_dump(in_array(true, $arr));
在这里,您可以比较boolean
和string
。手册说在这种情况下
将两边都转换为bool,FALSE <TRUE
'a'
转换为布尔值true。和true == true
,所以回归真实。
所以,这里没什么奇怪的,为了确保您的代码按预期工作,请使用$strict
的第三个参数in_array
。