我最近有一个关于in_array
的奇怪问题,我无法理解。
e.g。
$a = array('a','b','c');
$b = array(1,2,3);
if (in_array(0,$a))
{
echo "a bingo!\n";
}
else
{
echo "a miss!\n";
}
if (in_array(0,$b))
{
echo "b bingo!\n";
}
else
{
echo "b miss!\n";
}
我在灯上跑了,然后
a bingo!
b miss!
我阅读了手册并将第三个参数$strict
设置为true
,然后按预期工作。但这是否意味着我总是需要在使用{{1}时将strict参数设置为true建议将不胜感激。
此致
答案 0 :(得分:19)
这意味着当您希望比较时,您必须将第三个参数设置为true
,不仅要比较值,还要比较。
否则,在进行比较时会有类型转换 - 例如,请参阅String conversion to numbers。
事实上,in_array
没有和严格只是与==
和===
之间的差异 - 请参阅Comparison Operators 。
大多数情况下,这种转换工作正常......但是,如果您尝试将0与以字母开头的字符串进行比较,则不会:字符串转换为数字,其值为0。
答案 1 :(得分:6)
in_array
的“默认”模式使用loose comparison之类的==
comparison operator。这意味着0
的比较如下:
var_dump(0 == 'a'); // bool(true)
var_dump(0 == 'b'); // bool(true)
var_dump(0 == 'c'); // bool(true)
现在loose comparison operator ==
在实际比较值之前使用string conversion to integer:
如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都会转换为数字,并且数字会进行比较。
'a'
,'b'
和'c'
全部转换为0
:
var_dump((int) 'a'); // int(0)
var_dump((int) 'b'); // int(0)
var_dump((int) 'b'); // int(0)
但是在严格模式下使用in_array
(将第三个参数设置为 true )时,会完成strict comparison (===
),这意味着值和类型必须相等:< / p>
var_dump(0 === 'a'); // bool(false)
var_dump(0 === 'b'); // bool(false)
var_dump(0 === 'c'); // bool(false)
因此,在严格模式下使用in_array
时,您将获得预期结果:
var_dump(in_array(0, $a, true)); // bool(false)
答案 2 :(得分:1)
在你的第一个例子中,当转换为数字时,数组$ a的每个值都为0.这就是为什么你的第一个例子会产生“宾果游戏”。
如果您知道依赖于隐式转换,或者您的数据类型相同(例如,在字符串数组中搜索字符串),则不必使用strict参数。否则你应该使用strict参数,当你比较两个必须属于同一类型的值时,你应该使用===而不是==。