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

我在使用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为每个结果没有检查数组的其余部分,但我找不到任何文件,将build议非常奇怪的function。

函数in_array()array_search()行为不是一个错误,而是logging良好的行为。

两个函数都有第三个可选参数,称为$strict ,默认为FALSE:

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

mixed array_search(mixed $ needle,array $ haystack [,bool $ strict = false]

现在这意味着默认情况下,两个函数都使用松散的( == )比较来比较值。 所以他们只检查 PHPtypes的玩杂耍和没有检查types的值是否相同。 因为在你的例子TRUE == "any none emtpy string"求值为TRUE。

所以通过在调用函数时将第三个参数设置为TRUE,可以说PHP应该使用strict( === )比较,在比较时应该检查值的AND ANDtypes。

看到这个作为参考: 比较运算符的PHP等式(== double等于)和标识(=== triple等于)如何不同?

你是对的,布尔值确实可以造成这种情况。 在in_array函数中设置strict标志,这样也检查元素的types (基本上和使用=== ):

 if (in_array("username", $results, true)) // do something if (in_array("password", $results, true)) // do something if (in_array("birthday", $results, true)) // do something