【问题标题】:What is the reason for this strange PHP behaviour?这种奇怪的 PHP 行为的原因是什么?
【发布时间】:2012-01-05 00:22:15
【问题描述】:

我有以下代码:

$data = array(); // prep array
$data['aardvark'] = true;

print_r($data); // output array
echo "\n";
var_dump(in_array('zebra', $data));

输出如下:

Array
(
    [aardvark] => 1
)

bool(true)

尽管zebra 显然不在数组中。看起来这与 PHP 的松散类型系统有关。 (bool) 'zebra'true,并且数组中有一个true,所以in_array 返回true?

我想我可以看到逻辑,但它有缺陷。这是一个 PHP 错误吗?

干杯。

【问题讨论】:

  • 不知道有没有用,但是可以使用array_key_exists在数组的keys中搜索
  • 任何时候你把真、假、0或1放在一个数组中,in_array()基本上没有用,除非你指定使用严格比较。
  • @animuson:当然你可以有带有数值的数组,那么01in_array() 一起用在哪里?

标签: php arrays types


【解决方案1】:

你是对的。 in_array()

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

您必须将第三个参数设置为true,如果您希望in_array() 也针对该类型进行测试。否则会比较松散

var_dump(in_array('zebra', $data, true));

通常这没有问题,因为(在简洁的设计中)通常所有值都属于您在调用 in_array() 之前知道的相同类型,因此您可以避免使用不匹配的类型调用它。

【讨论】:

    【解决方案2】:

    不是错误。你完全正确。要正确找到您要查找的内容,您必须执行以下操作:

    if (in_array('zebra', $data, true)) {
    

    虽然在同一个数组中存储不同的数据类型(字符串和布尔值)可能很少见。如果您存储的数据不是列表,则很可能应该使用对象。

    【讨论】:

      【解决方案3】:

      “这不是错误,而是功能!” =)

      尝试执行in_array("zebra", $data, true);,这将强制进行“严格”检查(即,它将对您的变量进行类型检查)。

      【讨论】:

        【解决方案4】:

        发生这种情况是因为字符串 'zebra' 是非空的,并且除 '0' 之外的非空字符串被 PHP 解释为 true 并且由于您的数组中有一个匹配的值,所以您得到 true 为结果。

        PHP 进行了从字符串到布尔值的转换。为了避免这种转换,您需要将第三个参数作为true 传递给in_array

        var_dump(in_array('zebra', $data, true));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-19
          • 2017-07-21
          • 1970-01-01
          • 1970-01-01
          • 2011-09-30
          • 1970-01-01
          • 2017-03-30
          相关资源
          最近更新 更多