我正在处理来自API的响应,该API以相当简单的结构返回JSON中的数据。伪结构最好表现为:
services -> service -> options -> option -> suboptions -> option
由于这是解码的 JSON,因此所有这些都是 stdClass 对象。我有许多 foreach 语句遍历各种服务和选项,它们都可以毫无问题地工作。但是,当我在子选项级别使用 foreach 语句时,该对象被序列化为字符串。供您参考,子选项具有这样的结构。
[suboptions] => stdClass Object
(
[option] => stdClass Object
(
[code] => SOME_CODE
[name] => Some Name
)
)
当使用这样的foreach时(其中$option是服务->->选项->选项中的一个选项(:
foreach($option->suboptions->option as $suboption) {
print_r($suboption);
}
它输出
SOME_CODESome Name
不是预期的
stdClass Object
(
[code] => SOME_CODE
[name] => Some Name
)
我不知道有什么理由在深度或其他条件方面这样做。我已经尝试了我能想到的所有方法并搜索了SO,但找不到任何发生这种情况的情况。如果有人有任何想法,我很想听听!干杯。
抱歉,如果它在其他地方得到了回答,或者我错过了一些明显的东西。如果我有,到目前为止它已经逃脱了我。
编辑:对于那些询问它确实是AusPost PAC API的人。从刚果民主共和国转换,因为它正在被移除~2014。
我不能发表评论,因为我没有那么多的声誉,但我会尝试回答......
我假设你想从 PHP 数组中删除 stdClass?
如果是这样,请确保在解码 JSON 时使用true
。
示例:$array = json_decode($json, true);
有关 stdClass 的更多信息,请参阅这篇文章:PHP 中的 stdClass 是什么?
再次,如果我误解了你的问题,请原谅我,我只是希望我能发表评论......
我假设这是来自澳大利亚邮政邮资计算API的响应。此 API 做出了一个可怕的决定,即将只有一个项目的集合实例视为单个值。例如,service -> options -> option
可以是数组,也可以是单个选项。
我发现处理此问题的最简单方法是将option
转换为数组,例如
$options = $service->options->option;
if (!is_array($options)) {
$options = array($options);
}
// now you can loop over it safely
foreach ($options as $option) { ... }
您将对子选项执行相同的操作。如果你有兴趣,我有一个完整的库来处理AusPost API,使用Guzzle来管理HTTP端。
最后一个对象的值不是数组,因此您需要键和值。
foreach($option->suboptions->option as $key => $value) {
echo '<p>KEY:'.$key.' VALUE:'.$value.'</p>';
}