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 中的值?我在这里做一些根本错误的事情吗?

4

2 回答 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 都会查找一个 int 键并且永远不会找到它,从而为您提供NULL.

事实上,文档指出:

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

于 2012-10-11T05:18:27.753 回答
1

因为数据不是数组,所以它是一个对象。因此,您不能通过此代码段使用它

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

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

于 2012-10-11T05:18:23.910 回答