【问题标题】:array_key_exists error bafflingarray_key_exists 错误莫名其妙
【发布时间】:2019-02-04 18:42:01
【问题描述】:

这很可能不是可以通过复制和粘贴复制的东西。我在这里遇到的问题是 array_key_exists 根本不起作用。

我已将代码打印到页面上;它绝对是数组类型,不是必需的。数组键存在;我在字符串和整数之间进行了转换,但找不到它回来了。

现在,最令人费解的是我在

$presets    = $this->presets->$name;
echo gettype($version).'<br>';
foreach ( $presets as $key=>$test ) {
    if ( $key===$version ) echo 'string found1<br>';
    elseif ( $key==$version ) echo 'string found2<br>';
}
if ( !array_key_exists($version,$presets) )
    echo 'array_key_exists string fail.<br>';

$version = intval($version);
echo gettype($version).'<br>';
foreach ( $presets as $key=>$test ) {
    if ( $key===$version ) echo 'int found1<br>';
    elseif ( $key==$version ) echo 'int found2<br>';
}
if ( !array_key_exists($version,$presets) )
    echo 'array_key_exists int fail.<br>';

输出:

string
string found1
array_key_exists string fail.
integer
int found2
array_key_exists int fail.

输出非常奇怪,因为在 int 和 string 搜索中,键匹配。实际上,在string 搜索中,它会输出“string found1”,这意味着它=== 数组中的一个键。那么,为什么array_key_exists 总是产生FALSE?

变量$presets 是一些数组,其索引是使用 preg_match 正则表达式代码创建的以解析索引。这是我能想出的唯一增加的谜团,尽管手动比较已经证明发现了 === 值,因此这些都不重要。 array_key_exists 应该返回 TRUE

  Array
  (
      [100] => stdClass Object
          ()
  )

【问题讨论】:

  • $presets的内容是什么?
  • 我无法重现这个。但我也无法创建一个键是数字字符串的数组。每当我尝试将密钥设置为"100" 之类的字符串时,它就会变成整数100。你的var_dump() 也显示了一个数字键。
  • "$presets 是一些创建索引的数组..."。预设是否有可能是可遍历的对象? gettype($presets); 的输出是什么?
  • 当$presets 是stdClass 时可重现:php -r '$p = (object)["100" =&gt; new stdClass]; var_dump(array_key_exists("100", $p), array_key_exists(100, $p));' 输出:bool(false), bool(false)
  • @Barmar 也许像这样? stackoverflow.com/a/35180513/2734189

标签: php arrays array-key-exists


【解决方案1】:

根据您从$key==$version 和$key===$version 得到的结果,我们知道键是一个数字字符串。所以看来您使用的是 PHP

在这些版本中,您不能引用数字字符串数组键,array_key_exists 将返回 false,无论您以数字形式还是字符串形式提供键。 This confusing behavior was improved with PHP 7.2.

Here's a demo 说明了这一点,基于来自 this answer 的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多