如何在 PHP 中正确遍历 JSON 解码后的对象属性数组

当使用 `json_decode()` 将 json 字符串转为 php 对象后,需明确目标数据位于对象的哪个属性下;本例中待遍历的是 `$topic_obj->text` 这一数组属性,而非整个对象本身。

在 PHP 中,json_decode($json, $assoc = false) 默认返回一个 stdClass 对象,其结构严格对应原始 JSON。这意味着:

  • 顶层 JSON 对象 → PHP 的 stdClass 实例(如 $Topic_OBJ);
  • JSON 数组(如 "Text": [...])→ PHP 索引数组,作为该对象的一个属性存在,必须通过 ->Text 显式访问;
  • 直接 foreach ($Topic_OBJ as ...) 会遍历对象的公共属性(即 "TextContainer_id" 和 "Text" 两个属性),而 $obj->Text->Text_id 会失败,因为 $obj 实际是字符串键(如 "TextContainer_id")或数组("Text"),并非嵌套对象。

✅ 正确做法是:定位到目标数组属性,再对其迭代:

$Topic_OBJ = json_decode($this->api_local_get($url));
$Text_IDS = "";

// ✅ 正确:遍历 $Topic_OBJ 对象的 Text 属性(它是一个数组)
foreach ($Topic_OBJ->Text as $text) {
    $Text_IDS .= $text->Text_id . ',';
}

// 输出示例:'794887707,794887711,'

⚠️ 注意事项:

  • 在访问前建议校验属性是否存在且为数组,避免运行时错误:
    if (isset($Topic_OBJ->Text) && is_array($Topic_OBJ->Text)) {
        foreach ($Topic_OBJ->Text as $text) {
            if (isset($text->Text_id)) {
                $Text_IDS .= $text->Text_id . ',';
            }
        }
    }
  • 若需去除末尾多余逗号,可用 rtrim($Text_IDS, ',');
  • 如需更现代、安全的写法,可结合 array_column() 和 implode():
    $textIds = array_column((array)$Topic_OBJ->Text, 'Text_id');
    $Text_IDS = implode(',', $textIds) . ',';

总结:foreach 作用于对象本身 ≠ 遍历其内部数组属性;务必通过 ->属性名 明确路径访问嵌套结构。这是 JSON 解析后对象遍历中最常见的误区之一。