非关联数组上的PHP in_array行为

时间:2017-02-01 09:56:48

标签: php arrays

我偶然发现了一些奇怪的东西。假设您有以下数组:

$arr = [0,1,2,3];
// Note the first element is 0
var_dump(in_array('random_string', $arr));

输出:

bool(true)

然而

$arr = [3,1,2,3];
// Note the first element is NOT 0
var_dump(in_array('random_string', $arr))

输出:

bool(false)

这种行为是否有合理的解释?

3 个答案:

答案 0 :(得分:2)

我打赌你的字符串被类型变成了一个int(并且因为字符串没有合理的int表示,结果是它转换为0,它匹配第一个元素)

尝试在您用于第一个示例的字符串的开头添加一个数字,并且您会发现它将返回true或false,具体取决于字符串中的数字部分是否在数组中(“ 5个香蕉“将把类型变成5个”

in_array有第三个可选参数,一个布尔值,用于确定是否使用严格模式。如果没有设置或设置为false,那么PHP将键入-juggle the needle以匹配haystack的类型,并且会发生类似这样的问题。如果将其设置为true,则不会发生类型杂乱,而是使用严格比较。这将停止您遇到的问题,但是如果您使用“2”作为针并且[1,2,3]作为草垛,则“2”将不再匹配2并且in_array将返回false。

$arr = [0,1,2,3];
var_dump(in_array('3 banana', $arr)); // true because "3 banana" == 3
var_dump(in_array('5 banana', $arr)); // false because "5 banana" == 5
var_dump(in_array('3 banana', $arr, true)); // false because "3 banana" !== 3
var_dump(in_array('random_string', $arr)); // true because "random_string" == 0
var_dump(in_array('random_string', $arr, true)); // false
var_dump(in_array('3', $arr, true)); // false because "2" !== 2

答案 1 :(得分:1)

这是因为非严格的比较而发生的。你的字符串被转换为整数值" 0",我们可以在第一个数组中看到这个值。

Example in PHP sanbox

答案 2 :(得分:-1)

实际上in_array返回0和1值,根据你的que,当你检查

时返回1
$arr = [0,1,2,3];
var_dump(in_array('random_string', $arr));

var_dump(in_array('random_string', $arr));返回数据类型1的布尔值(true),这就是为什么它返回bool(true)和检查时的另一面

$arr = [3,1,2,3];
var_dump(in_array('random_string', $arr))

var_dump(in_array('random_string', $arr));返回0的数据类型它的布尔值(false)这就是为什么它的返回bool(false)