【发布时间】: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" => 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