给定数组中为什么0和true?

问题描述 投票:1回答:2

我试图在phptester.net上测试一些东西并遇到了一些我不知道的东西。我不确定为什么使用PHP 7.0时,以下某些陈述是正确的。

<?php

$arr = array('a', 'b', 'c');

var_dump(in_array('a', $arr));   // bool(true)

var_dump(in_array(false, $arr)); // bool(false)
var_dump(in_array(null, $arr));  // bool(false)
var_dump(in_array(0, $arr));     // bool(true) ----> why?

var_dump(in_array(1, $arr));     // bool(false)
var_dump(in_array(true, $arr));  // bool(true) ----> why?

in_array(),为什么是“为什么”?评论线是真的吗?

php arrays
2个回答
2
投票

in_array的第三个参数,默认为FALSE。如果您没有明确指定为TRUE,则in_array不会检查类型。

在整数上下文中,非数字字符串为零,因此没有严格检查,'a''b''c'0s,所以0在该数组中。

类似地,在布尔上下文中,非空字符串是TRUE,因此在该数组中也可以找到TRUE


4
投票

根据php手册(我建议你阅读)in_array

除非设置严格,否则使用松散比较搜索干草堆的针。

这里的主要词是宽松的比较。

所以,php执行一些类型转换和比较值。

根据比较表here,我们可以用你的案例解释这里做了什么:

var_dump(in_array(0, $arr));

在这里,您可以比较numberstring。手册说在这种情况下

将字符串和资源转换为数字,通常的数学

所以,第一个值'a'被转换为0.因为这个字符串中没有数字。 0 == 0,返回true。

下一个:

var_dump(in_array(true, $arr));

在这里,您可以比较booleanstring。手册说在这种情况下

将两边都转换为bool,FALSE <TRUE

'a'转换为布尔值true。和true == true,所以回归真实。

所以,这里没什么奇怪的,为了确保您的代码按预期工作,请使用$strict的第三个参数in_array

© www.soinside.com 2019 - 2024. All rights reserved.