我们有一个数组,其键是字符串,但这些字符串有时只是数字(例如“123”)。当尝试通过键“123”访问数组时,我们得到一个未定义的索引通知。当仅通过整数123访问它时,我们得到Undefined Offset通知。这告诉我们我们正在尝试使用“123”字符串正确编制索引,但它仍未设置。
尝试为这个SO问题提出一个例子这很难,因为PHP会自动将我们的测试用例中的数组键转换为整数,而在我们的实际应用程序中,这不会发生(由于使用了Java Bridge) )。我们现在尝试的测试数组是:
<?php
$array = array("123" => array(108, 8));
var_dump($array);
?>
返回:
array(1) { [123]=> array(2) { [0]=> int(108) [1]=> int(8) } }
虽然在我们的现实世界中,它会返回:
array(1) { ["123"]=> array(2) { [0]=> int(108) [1]=> int(8) } }
所以在现实世界中,索引实际上是一个字符串:
<?php
var_dump(array_keys($array));
?>
返回
array(1) { [0]=> string(3) "123" }
所以,最后问题是以下代码的输出:
<?php
foreach ($array as $key => $value) {
if (!isset($array[$key])) {
print "What is happening here?";
}
}
?>
给出:
What is happening here?
根据Yoshi的评论,这是工作测试代码:
<?php
$array = (array)json_decode('{"123":[108,8]}');
foreach ($array as $key => $value) {
if (!isset($array[$key])) {
print "What is happening here?";
} else {
print "Nothing to see here, move along";
}
}
?>
答案 0 :(得分:2)
也不是非常优雅的解决方案,但也可以工作,不需要重新创建阵列。此外,您还可以访问元素值。
$array = (array)json_decode('{"123":100}');
$array_keys = array_keys($array);
$array = (object)$array;
foreach ($array_keys as $key)
{
if (!isset($array->$key))
{
print "What is happening here?";
}
else {
print "It's OK val is {$array->$key}";
}
}
在键入$
之前注意$array->$key
,这很重要。
答案 1 :(得分:1)
查看此代码(和行$array[(string)$key]
)
<?php
$array = array("123" => array(108, 8));
foreach ($array as $key => $value)
{
if (!isset($array[(string)$key]))
{
print "What is happening here?";
}
else print "It's just types";
}
$ key的类型自动转换为整数,这就是为什么在数组中找不到这个键的原因。
您可以在手册中找到有关它的所有信息:http://php.net/manual/en/language.types.type-juggling.php
此代码适用于两种情况:
foreach ($array as $key => $value)
{
if (!array_key_exists($key, $array))
{
print "What is happening here?";
}
else print "It's just types";
}
答案 2 :(得分:0)
我遇到了同样的问题(但是使用了array_intersect_key)。
这是我的解决方案:
$array = array_combine(array_keys($array), $array)