我有一些类似于以下内容的JSON:
{"internalArray": {"201": "A", "202": "B", "5": "C", "46": "D"},
"data": "ABCDEFG",
"data2": "TSXPIIF"}
我使用以下PHP代码对其进行解码:
$jsonOutput = json_decode($output);
我想从JSON数据访问“internalArray”,所以我使用以下内容来引用它:
$internalArray = $jsonOutput->{'internalArray'};
当我在$ internalArray
上执行var_dump时object(stdClass)#4 (4)
{ ["201"]=> string(1) "A"
["202"]=> string(1) "B"
["5"]=> string(1) "C"
["46"]=> string(1) "D"
}
我发现我可以将它转换为数组,所以我做了以下内容:
$internalArray = (array) $jsonOutput->{'internalArray'};
但是,现在我有了这个数组,我似乎无法使用像
这样的值来访问它$internalArray["202"], $internalArray["201"], etc.
当我尝试通过键访问它时,它返回NULL。但是,当我有这样的代码时:
foreach ($internalArray as $key => $value)
{
echo $key . "," . $value;
}
按预期打印出值,如“202,A”等
但是,如果我将其更改为
,则使用相同的代码foreach ($internalArray as $key => $value)
{
echo $key . "," . $internalArray[$key];
}
它不起作用!
任何人都可以解释为什么我无法使用密钥访问$ internalArray中的值吗?我在这里做了一些根本错误的事情吗?
答案 0 :(得分:8)
如果你想要一个关联数组,可以向PHP索取一个关联数组(参见json_decode
的文档):
$jsonOutput = json_decode($output, true);
var_dump($jsonOutput['internalArray']);
产地:
array(4) {
[201]=>
string(1) "A"
[202]=>
string(1) "B"
[5]=>
string(1) "C"
[46]=>
string(1) "D"
}
回到你的问题,如果内部数组中的键不是数字,你的代码仍然可以正常工作。这里发生的事情有点奇怪:PHP不允许您将数字字符串(例如:'201'
,'46'
)作为数组的键。
数字字符串键将转换为数字键。因此,当您$arr['201']
时,PHP会查找$arr[201]
。但是,当您将对象转换为数组时,看起来数组键仍然是字符串(例如:$arr['201']
)。现在实际的数组有一个数字字符串键,但是每当你尝试访问它时,PHP都会查找一个int键而从不找到它,给你NULL
。
事实上,the documentation指出:
如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名,带有几个值得注意的例外:整数属性不可访问; (...)
答案 1 :(得分:1)
因为数据不是数组,所以它是一个对象。因此,您无法通过此代码段
使用它foreach ($internalArray as $key => $value)
{
echo $key . "," . $internalArray[$key];
}
并用于关联数组json_decode($output, true);