array_key_exists错误令人困惑

时间:2018-08-29 21:49:05

标签: php arrays array-key-exists

这很可能不是可以通过复制粘贴复制的内容。我在这里遇到的问题是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.

输出绝对是奇怪的,因为在intstring搜索中,键都匹配。实际上,在string搜索中,它输出“ string found1”,这意味着它===数组中的键。那么,为什么array_key_exists总是产生FALSE

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

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

1 个答案:

答案 0 :(得分:0)

根据您从$key==$version$key===$version获得的结果,我们知道键是一个数字字符串。看来您使用的是PHP <7.2版本。

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

Here's a demo基于this answer的示例进行了说明。