
本文详解如何对 `json_decode()` 返回的 php 对象中嵌套的数组属性(如 `->text`)进行安全、准确的遍历,避免因误遍历顶层对象导致空结果的问题。
在 PHP 中使用 json_decode() 解析 JSON 字符串时,默认返回的是一个 stdClass 对象,而非关联数组(除非显式传入第二个参数 true)。这意味着你必须通过对象属性语法(->)访问数据,且不能直接 foreach 遍历整个对象来获取其内部数组字段的内容——因为 foreach ($obj as $item) 会遍历该对象的所有公共属性,而你的目标数据实际位于 $obj->Text 这个数组属性中。
在你的代码中:
foreach ($Topic_OBJ as $obj) {
$Text_IDS .= $obj->Text->Text_id.",";
}问题在于:$Topic_OBJ 是一个单层对象(含 TextContainer_id 和 Text 两个属性),它本身不是数组,因此 foreach ($Topic_OBJ as $obj) 实际只迭代一次,$obj 是第一个属性值(即整数 339131662),随后 $obj->Text 会触发 Trying to get property 'Text' of non-object 警告,最终 $obj->Text->Text_id 为 null,拼接出空字符串 ","。
✅ 正确做法是:明确指向并遍历 $Topic_OBJ->Text 这个数组属性:
立即学习“PHP免费学习笔记(深入)”;
$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,"? 小技巧:为避免末尾多余的逗号,推荐使用 array_map() + implode() 组合:
$ids = array_map(fn($t) => $t->Text_id, $Topic_OBJ->Text);
$Text_IDS = implode(',', $ids) . ','; // 若需结尾逗号
// 或更简洁(无需结尾逗号):
$Text_IDS = implode(',', array_column((array)$Topic_OBJ->Text, 'Text_id'));⚠️ 注意事项:
- 始终检查 json_decode() 是否成功:if (json_last_error() !== JSON_ERROR_NONE) { /* 处理错误 */ }
- 确保 Text 属性存在且为数组:if (isset($Topic_OBJ->Text) && is_array($Topic_OBJ->Text)) { ... }
- 如需调试结构,用 var_dump($Topic_OBJ); 或 print_r($Topic_OBJ); 查看真实类型。
掌握这一关键点——区分对象本身与它的数组属性——即可高效、可靠地处理各类嵌套 JSON 数据。











