Php,in_array,0值

Avi*_*ida 24 php arrays

我试图了解in_array下一个场景中的行为:

$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
var_dump(in_array(0, $arr));
Run Code Online (Sandbox Code Playgroud)

返回的值in_array()是boolean true.正如你所看到的那样,没有值相等0,所以如果有人可以帮助我理解为什么函数返回true?

Sam*_*son 56

根据文档中的注释,这是一个已知问题.请考虑以下示例:

in_array(0, array(42));      // FALSE
in_array(0, array('42'));    // FALSE
in_array(0, array('Foo'));   // TRUE
Run Code Online (Sandbox Code Playgroud)

为避免这种情况,请提供第三个参数,true将比较置于严格模式,这不仅会比较值,还会比较类型:

var_dump(in_array(0, $arr, true));
Run Code Online (Sandbox Code Playgroud)

存在其他解决方法,不需要将每个检查置于严格模式:

in_array($value, $my_array, empty($value) && $value !== '0');
Run Code Online (Sandbox Code Playgroud)

但为什么?

所有这些背后的原因可能是字符串到数字的转换.如果我们试图从"再见"中获取一个数字,我们会得到0,这是我们要求查询的值.

echo intval("Bye"); // 0
Run Code Online (Sandbox Code Playgroud)

为了确认这一点,我们可以array_search用来找到与匹配值相关联的键:

$arr = array(2 => 'Bye', 52, 77, 3 => 'Hey');
echo array_search(0, $arr);
Run Code Online (Sandbox Code Playgroud)

在这里,返回的键是2,意味着0在转换为Bye整数时找到.

  • 如果它解释了PHP为什么将'0 =='string'`评估为TRUE,则此答案会更好。 (2认同)
  • @ernie在玩杂耍后,一串'4u'将被转换为4.但如果第一个字符不是数字,则将其转换为0.绝对是一个有趣的问题. (2认同)

Mad*_*aks 7

尝试truein_array通话中添加第三个参数(严格模式).