【问题标题】:PHP in_array() / array_search() odd behaviourPHP in_array() / array_search() 奇怪的行为
【发布时间】:2011-02-13 22:19:17
【问题描述】:

我在使用 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,但我找不到任何文档表明这种非常奇怪的功能。

【问题讨论】:

  • 能否提供更完整的代码示例?您发布的代码不是很有帮助。你可能刚刚犯了一个作业错误或其他什么......
  • 在运行检查之前将结果变量分配给该行。然后我在该行之后添加了die(var_dump($results)),以查看它返回的数组。

标签: php arrays boolean


【解决方案1】:

函数in_array()array_search() 的这种行为不是错误,而是有据可查的行为。

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

bool in_array (混合 $needle , array $haystack [, bool $strict = FALSE ] )

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

现在这意味着默认情况下,这两个函数都使用松散的(==) 比较来比较值。所以他们只检查值是否相同 after PHP 类型杂耍而不检查类型。因此,在您的示例中,TRUE == "any none emtpy string" 的计算结果为 TRUE。

因此,通过在调用函数时将第三个参数设置为 TRUE,您说 PHP 应该使用严格(===)比较,并且在比较时应该检查值和值的类型。

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

【讨论】:

  • 我的 in_array 几乎可以接受任何使用 python 脚本发布到 php 脚本中的变量。非常不寻常,但这解决了它。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2014-02-01
    相关资源
    最近更新 更多