一尘不染

PHP in_array()/ array_search()奇怪的行为

php

我在使用PHP函数时发现了一些奇怪的行为in_array()。我有一个像这样的数组:

$arr = [TRUE, "some string", "something else"];

现在,如果我要检查"test"数组中是否存在它,显然不是,但是in_array()仍然返回TRUE,为什么呢?

$result = in_array("test", $arr);
var_dump($result);  // **Output: bool(true)**

使用时会发生相同的事情array_search()

$result = array_search("test", $arr);
var_dump($result);  // **Output: int(0)**

我认为也许数组中的值TRUE会自动导致该函数为每个结果返回TRUE,而不检查数组的其余部分,但是我找不到任何文档来表明这种非常奇怪的功能。


阅读 490

收藏
2020-05-26

共1个答案

一尘不染

该函数的这种行为in_array()array_search()不是一个错误,而是有据可查的行为。

这两个函数都有一个名为的第三个可选参数$strict,默认情况下为FALSE:

bool in_array(混合$ needle,array $ haystack [,bool $ strict = FALSE]

混合array_search(混合$ needle,数组$ haystack [,bool $ strict = false]

现在,这意味着默认情况下,两个函数都使用松散(==)比较来比较值。因此,它们仅 PHP类型变戏法 之后
检查值是否相同,而不检查类型。因此,在您的示例中,TRUE == "any none emtpy string"计算结果为TRUE。

因此,通过在调用函数时将第3个参数设置为TRUE,可以说PHP应该使用strict(===)比较,并且在比较时应该检查值和值的类型。

2020-05-26