将数组从json解码为PHP,无法使用键访问数组元素

时间:2012-10-11 05:14:11

标签: php json

我有一些类似于以下内容的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 个答案:

答案 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);