foreach stdClass 对象转换为字符串


foreach stdClass object converted to string

我正在处理来自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>';
}