贝利信息

如何在 PHP 中正确遍历 JSON 解码后的对象属性(特别是嵌套数组)

日期:2026-01-05 00:00 / 作者:碧海醫心

本文详解如何对 `json_decode()` 返回的 php 对象进行安全、准确的遍历,重点解决因误判数据结构(如将对象属性当作可迭代对象)导致的循环失效问题,并提供健壮的实践方案。

在 PHP 中使用 json_decode() 解析 JSON 数据时,返回的是一个 stdClass 对象(默认行为),其属性访问需通过 -> 语法,而对象本身不可直接 foreach 遍历——除非该对象实现了 Traversable 接口(原生 stdClass 并未实现)。常见误区正是试图直接 foreach ($obj as $item),却忽略了 $obj 实际是单个对象,而非数组。

以你的数据结构为例:

{
  "TextContainer_id": 339131662,
  "Text": [
    { "Text_id": 794887707, "TextContainer_id": 339131662 },
    { "Text_id": 794887711, "TextContainer_id": 339131662 }
  ]
}

此处 "Text" 是一个索引数组(array),存储在 $Topic_OBJ 对象的 Text 属性下。因此,正确做法是遍历 $Topic_OBJ->Text,而非 $Topic_OBJ 本身:

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

// ✅ 正确:遍历对象的 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 . ',';
        }
    }
}
$ids = array_map(fn($t) => $t->Text_id ?? '', $Topic_OBJ->Text ?? []);
$Text_IDS = implode(',', $ids) . ($ids ? ',' : '');

总结:foreach 的目标必须是数组或可迭代对象;json_decode() 返回的对象仅作为容器,其内部属性(尤其是带方括号 [] 的 JSON 字段)才可能是待遍历的数组。理解 JSON → PHP 类型映射关系,是避免此类问题的根本。