1

这很可能不是可以通过复制和粘贴复制的东西。我在这里遇到的问题是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
          ()
  )
4

1 回答 1

0

根据你从$key==$version和得到的结果$key===$version,我们知道键是一个数字字符串。因此,您似乎使用的是 PHP < 7.2 的版本。

在这些版本中,您不能引用数字字符串数组键,并且无论您以数字形式还是字符串形式给出键,array_key_exists都将返回。PHP 7.2 改进了这种令人困惑的行为。false

这是一个演示,基于此答案中的示例。

于 2018-08-29T23:04:48.937 回答