关于in_array的一个问题

时间:2010-03-19 11:42:43

标签: php arrays

我最近有一个关于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建议将不胜感激。

此致

3 个答案:

答案 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参数,当你比较两个必须属于同一类型的值时,你应该使用===而不是==。