解码JSON数组到PHP中,无法使用键访问数组元素

3

我有一些类似于下面的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中的值吗?我在这里做错了什么基本的事情吗?

2个回答

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 都会查找一个整数键,却从未找到它,给你返回了 NULL

事实上,文档 指出:

如果一个对象被转换为数组,结果是一个数组,其元素是对象的属性。键是成员变量名称,有一些值得注意的例外:整数属性是不可访问的;(...)


谢谢,这解决了我的问题。在访问数组方面,我能够使用strval来正确访问数组。 - steve8918
@steve8918 出于好奇,你是如何解决数组访问问题的? - NullUserException
我使用了strval()函数将整数转换为字符串,然后像这样访问值$internalArray[strval($i)]。这对我来说似乎是有效的。 - steve8918
@steve8918 嗯,我认为这没有什么区别。请参见:http://codepad.org/9nc0eJHk(请注意,无论我如何尝试访问`$objArr ['5'],我都会得到NULL`); 数字字符串作为数组键是不可访问的。如果您将数字作为键,则无论如何都会将其转换为int。 - NullUserException
奇怪。我使用了您的第一个建议,并在json_decode中添加了“true”,这解决了我的问题。使用该关联数组,我能够使用strval()索引我的值。但是,如果没有将true添加到json_decode中,就像您的第一个示例所示,对我来说什么都不起作用。 - steve8918
@steve8918 如果你有一个关联数组,就不需要使用 strval - NullUserException

1

因为数据不是数组,而是一个对象。因此,您无法使用此代码片段。

foreach ($internalArray as $key => $value)
{
   echo $key . "," . $internalArray[$key];
}

并且用于关联数组 json_decode($output, true);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接