奇怪的in_array()行为

时间:2015-06-03 14:21:05

标签: php arrays

我对in_array()的结果有些麻烦。这不像我期望的那样,并且我理解手册。

简单测试:

$_aOperatorsOneOptin = array('DE-010', 'DE-005');

$bMatchPaymentOperator = in_array(0 , $_aOperatorsOneOptin);

if($bMatchPaymentOperator)
    echo 'found';

我希望我不会得到这个结果,但$ bMatchPaymentOperator是真的!

我希望

$bMatchPaymentOperator = in_array('DE-010' , $_aOperatorsOneOptin);

是真的,它是。 但为什么哦,为什么上层陈述是真的?

5 个答案:

答案 0 :(得分:4)

使用in_array的第三个参数强制严格匹配

<?php

$_aOperatorsOneOptin = array('DE-010', 'DE-005');

$bMatchPaymentOperator = in_array(0 , $_aOperatorsOneOptin, true);

if($bMatchPaymentOperator == true)
    echo 'found';

答案 1 :(得分:3)

这是因为当你将数字与php中的字符串进行比较时,php会在进行比较之前将字符串转换为数字。不以数字开头的字符串将转换为0,因此0 == 'hello world';

您可以通过将true作为第三个参数传递给in_array()来强制in_array检查数据类型以及完全匹配的内容。

$_aOperatorsOneOptin = array('DE-010', 'DE-005');

$bMatchPaymentOperator = in_array(0, $_aOperatorsOneOptin, true);

if($bMatchPaymentOperator)
    echo 'found';

有关比较的详情,请参阅http://php.net/manual/en/language.operators.comparison.php

答案 2 :(得分:2)

由于PHP的真实/虚假的怪异,我期待。尝试:

$bMatchPaymentOperator = in_array('0' , $_aOperatorsOneOptin);

答案 3 :(得分:2)

必须在引号中:

$bMatchPaymentOperator = in_array('0' , $_aOperatorsOneOptin);
var_dump($bMatchPaymentOperator);

结果:bool(false)

答案 4 :(得分:1)

奇怪的行为正在发生,因为0 == "this is a string"即php中的0 = any string只是查看这个简单的例子

<?php
if( 0 == "this is a string"){
    echo("true");
}
else{
    echo("false");
}
?>

输出:true

因此in_array函数显示了这种奇怪的行为

为了使你的代码工作,只需将in_array的严格参数添加到true

检查此代码

<?php
$_aOperatorsOneOptin = array('DE-010', 'DE-005');

$bMatchPaymentOperator = in_array(0,$_aOperatorsOneOptin,true);

if($bMatchPaymentOperator){
    echo 'found';
}
else{
    echo "Not found";
}
?>

输出:未找到