我最近遇到一个奇怪的问题in_array,我无法理解.例如
$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";
}
Run Code Online (Sandbox Code Playgroud)
我把它放在我的灯上,然后得到了
a bingo!
b miss!
Run Code Online (Sandbox Code Playgroud)
我阅读了手册并将第三个参数设置$strict为true,然后按预期工作.但这是否意味着我总是需要在使用时将strict参数设置为true in_array?建议将不胜感激.
问候
的"默认"模式in_array是使用松散比较像==比较运算符一样.这意味着0比较如下:
var_dump(0 == 'a'); // bool(true)
var_dump(0 == 'b'); // bool(true)
var_dump(0 == 'c'); // bool(true)
Run Code Online (Sandbox Code Playgroud)
现在松散比较运算符==在实际比较值之前使用字符串转换为整数:
如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串将转换为数字,并且数字执行比较.
而且'a','b'和'c'被全部转换为0:
var_dump((int) 'a'); // int(0)
var_dump((int) 'b'); // int(0)
var_dump((int) 'b'); // int(0)
Run Code Online (Sandbox Code Playgroud)
但是in_array在严格模式下使用(将第三个参数设置为true)时,会执行严格的比较(===),这意味着值和类型必须相等:
var_dump(0 === 'a'); // bool(false)
var_dump(0 === 'b'); // bool(false)
var_dump(0 === 'c'); // bool(false)
Run Code Online (Sandbox Code Playgroud)
因此,当使用in_array严格模式时,您将获得预期的结果:
var_dump(in_array(0, $a, true)); // bool(false)
Run Code Online (Sandbox Code Playgroud)