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

时间:2010-04-29 17:29:30

标签: php arrays boolean

我在使用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,而不检查数组的其余部分,但我找不到任何可能表明这些奇怪功能的文档。

2 个答案:

答案 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应该使用严格(===)比较,它应该在比较时检查值的值和类型。

将此视为参考:How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?

答案 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