代码之家  ›  专栏  ›  技术社区  ›  animuson

php in_array()/array_search()奇数行为

  •  5
  • animuson  · 技术社区  · 15 年前

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

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

    现在如果我想检查 "test" 在数组中,显然不是,但是 INA数组() 仍然是真的,为什么?

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

    使用时也会发生同样的情况 array_search() :

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

    我认为数组中的值“真”可能会自动导致函数在不检查数组其余部分的情况下为每个结果返回“真”,但我找不到任何文档可以说明非常奇怪的功能。

    2 回复  |  直到 8 年前
        1
  •  9
  •   Community CDub    8 年前

    函数的这种行为 in_array() array_search() 不是bug,而是记录良好的行为。

    这两个函数都有第三个可选参数调用 $strict 默认为假:

    bool in ou array(混合$needle,array$haystack [,bool$strict=false] )

    混合数组搜索(混合$needle,数组$haystack [,bool$strict=false] )

    这意味着默认情况下,两个函数都使用松散的( == )比较以比较值。因此,它们只检查值是否相同 之后 php类型玩杂耍,不检查类型。因为在你的例子中 TRUE == "any none emtpy string" 计算结果为true。

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

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

        2
  •  2
  •   Felix Kling    15 年前

    你是对的,布尔值确实会导致这种情况。设置 strict 旗在 in_array 功能,这样也可以 类型 元素的检查(基本上与使用 === ):

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