我正在使用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是服务中的选项 - > service - > options - > 选项)时:
foreach($option->suboptions->option as $suboption) {
print_r($suboption);
}
输出
SOME_CODESome Name
不是预期的
stdClass Object
(
[code] => SOME_CODE
[name] => Some Name
)
我不知道有任何理由可以在深度或其他条件方面做到这一点。 我已经尝试了所有我能想到的东西,并通过SO搜索,但无法找到任何发生这种情况的情况。如果有人有任何想法,我很乐意听到他们!欢呼声。
道歉,如果它已在其他地方得到解答或我遗漏了一些明显的东西。如果我有,它到目前为止已经逃脱了。
编辑:对于那些要求它确实是AusPost PAC API的人。从DRC转移到正在移除〜2014年。
答案 0 :(得分:1)
我无法评论,因为我没有那么多的声誉,但我会尽力回答......
我假设您要从PHP数组中删除stdClass?
如果是,请确保在解码JSON时使用true
。
示例:$array = json_decode($json, true);
有关stdClass的更多信息,请参阅此SO帖子:What is stdClass in PHP?
再次,请原谅我,如果我误解了你的问题,我只是希望我能发表评论......
答案 1 :(得分:0)
最后一个对象的值不是数组,因此您需要键和值。
foreach($option->suboptions->option as $key => $value) {
echo '<p>KEY:'.$key.' VALUE:'.$value.'</p>';
}
答案 2 :(得分:0)
我假设这是来自Australia Post postage calculation 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) { ... }
你会对子选项做同样的事情。如果您有兴趣,我会使用Guzzle管理HTTP端,从而获得一个处理AusPost API的整个库。