将数组从json解码为PHP,无法使用键访问数组元素
我有一些类似于以下内容的JSON:将数组从json解码为PHP,无法使用键访问数组元素,php,json,Php,Json,我有一些类似于以下内容的JSON: {"internalArray": {"201": "A", "202": "B", "5": "C", "46": "D"}, "data": "ABCDEFG", "data2": "TSXPIIF"} $internalArray = $jsonOutput->{'internalArray'}; $internalArray = (array) $jsonOutput->{'internalArray'}; 我使用以下PHP代
{"internalArray": {"201": "A", "202": "B", "5": "C", "46": "D"},
"data": "ABCDEFG",
"data2": "TSXPIIF"}
$internalArray = $jsonOutput->{'internalArray'};
$internalArray = (array) $jsonOutput->{'internalArray'};
我使用以下PHP代码对其进行解码:
$jsonOutput = json_decode($output);
我希望从JSON数据访问“internalArray”,因此我使用以下方法引用它:
{"internalArray": {"201": "A", "202": "B", "5": "C", "46": "D"},
"data": "ABCDEFG",
"data2": "TSXPIIF"}
$internalArray = $jsonOutput->{'internalArray'};
$internalArray = (array) $jsonOutput->{'internalArray'};
当我在$internalArray上执行var_转储时
object(stdClass)#4 (4)
{ ["201"]=> string(1) "A"
["202"]=> string(1) "B"
["5"]=> string(1) "C"
["46"]=> string(1) "D"
}
我发现我可以将其转换为数组,所以我做了以下操作:
{"internalArray": {"201": "A", "202": "B", "5": "C", "46": "D"},
"data": "ABCDEFG",
"data2": "TSXPIIF"}
$internalArray = $jsonOutput->{'internalArray'};
$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中的值吗?我在这里犯了什么根本性的错误吗?因为数据不是数组,而是对象。因此,此代码段不能使用它
foreach ($internalArray as $key => $value)
{
echo $key . "," . $internalArray[$key];
}
并用于关联数组
json_解码($output,true)代码>如果需要关联数组,可以向PHP请求关联数组(请参阅文档了解):
产生:
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
事实上,委员会注意到:
如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。键是成员变量名,有几个显著的例外:整数属性是不可访问的;(……)
谢谢,这解决了我的问题。在访问数组方面,我能够使用strval正确访问数组。@steve8918出于好奇,您是如何解决数组访问问题的?我使用strval()将整数转换为字符串,然后访问$internalArray[strval($I)]等值。这似乎对我有用。@steve8918嗯,我不认为这有什么区别。请参阅:(注意我如何获得NULL
,无论我如何尝试访问$objArr['5']
);数组中作为键的数字字符串呈现为不可访问。如果你有一个数字作为键,不管发生什么,它都会被转换成int。我使用了您的第一个建议,并在json_解码中添加了“true”,这就解决了我的问题。使用该关联数组,我可以使用strval()为我的值编制索引。但是是的,如果不将true添加到json_decode中,对我来说没有任何效果,就像您的第一个示例所示。