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