Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数组从json解码为PHP,无法使用键访问数组元素_Php_Json - Fatal编程技术网

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

将数组从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代

我有一些类似于以下内容的JSON:

{"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中,对我来说没有任何效果,就像您的第一个示例所示。