关于in_array的一个问题

You*_*ung 14 php arrays

我最近遇到一个奇怪的问题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)

我阅读了手册并将第三个参数设置$stricttrue,然后按预期工作.但这是否意味着我总是需要在使用时将strict参数设置为true in_array?建议将不胜感激.

问候

Pas*_*TIN 19

这意味着您必须将第三个参数设置为true您希望比较时不仅要比较值,还要比较类型.

否则,在进行比较时会有类型转换 - 例如,请参阅字符串转换为数字.

事实上,in_array没有和严格只是==和之间的差异=== - 参见比较运算符.


在大多数情况下,这种转换可以正常工作......但是如果您尝试将0与以字母开头的字符串进行比较,则不会:字符串转换为数字,其值为0.


Gum*_*mbo 6

的"默认"模式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)