将foreach stdClass对象转换为字符串

时间:2013-10-07 01:55:32

标签: php string object foreach stdclass

我正在使用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年。

3 个答案:

答案 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的整个库。