我在使用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,而不检查数组的其余部分,但我找不到任何可能表明这些奇怪功能的文档。
答案 0 :(得分:9)
函数in_array()
和array_search()
的这种行为不是错误,而是记录良好的行为。
这两个函数都有一个名为$strict
的第三个可选参数,默认情况下为FALSE:
bool in_array(混合$ needle,数组$ haystack [,bool $ strict = FALSE] )
mixed array_search(mixed $ needle,array $ haystack [,bool $ strict = false] )
现在这意味着默认情况下两个函数都使用松散(==
)比较来比较值。所以他们只检查 PHP类型杂耍后的值是否相同并且不检查类型。因为在您的示例中TRUE == "any none emtpy string"
评估为TRUE。
因此,通过在调用函数时将第3个参数设置为TRUE,您说PHP应该使用严格(===
)比较,它应该在比较时检查值的值和类型。
答案 1 :(得分:2)
你是对的,布尔确实可以导致这个。在in_array
函数中设置strict
标志,这样也会检查元素的类型(基本上与使用===
相同):
if (in_array("username", $results, true)) // do something
if (in_array("password", $results, true)) // do something
if (in_array("birthday", $results, true)) // do something