
本文详解如何正确解析 API 返回的 JSON 数据(使用 json_decode($json, true) 得到关联数组),并通过 foreach 安全、高效地遍历多层嵌套结构(如 result → property 和 result → images),避免因混淆对象与数组语法导致的访问错误。
本文详解如何正确解析 api 返回的 json 数据(使用 `json_decode($json, true)` 得到关联数组),并通过 `foreach` 安全、高效地遍历多层嵌套结构(如 `result → property` 和 `result → images`),避免因混淆对象与数组语法导致的访问错误。
在 PHP 中调用外部 API 并处理 JSON 响应是常见任务,但一个极易被忽视的关键点是:json_decode() 的第二个参数决定返回值类型。当你传入 true(即 json_decode($resp, true)),PHP 会将 JSON 对象转为关联数组(array),而非 stdClass 对象。这意味着你必须使用方括号语法($arr['key'])而非箭头操作符($obj->key)来访问数据——否则将触发 Trying to get property 'xxx' of non-object 等致命错误。
从你的 var_dump($decode) 输出可见,响应结构为:
[
'error' => '',
'result' => [
'property' => [...], // 单个房产信息(非数组!是关联数组)
'images' => [...], // 图片列表(索引数组,含多个子数组)
'specifications'=> [...] // 配置项列表(索引数组)
]
]⚠️ 特别注意:$decode['result']['property'] 是单个房产的关联数组(不是数组的数组),而 $decode['result']['images'] 才是包含多个图片信息的索引数组。因此,遍历逻辑需严格区分:
✅ 正确遍历方式(基于关联数组)
1. 提取单个房产信息(无需 foreach)
// 因为 'property' 是单维关联数组,直接访问即可
if (isset($decode['result']['property'])) {
$prop = $decode['result']['property'];
echo "ID: " . $prop['PROPERTY_ID'] . "\n";
echo "类型: " . $prop['PROP_TYPE_NAME'] . "\n";
echo "价格: " . $prop['PRICE_FORMATTED'] . " " . $prop['CURRENCY_ICON'] . "\n";
}2. 遍历多张图片(使用 foreach)
// 'images' 是索引数组,每个元素是一个图片关联数组
if (isset($decode['result']['images']) && is_array($decode['result']['images'])) {
echo "<h3>房产图片列表(共 " . count($decode['result']['images']) . " 张):</h3>\n";
foreach ($decode['result']['images'] as $index => $image) {
echo "<p><strong>第 " . ($index + 1) . " 张:</strong><br>";
echo "缩略图: <img src='{$image['thumb_url']}' style="max-width:90%" alt='Thumbnail'><br>";
echo "原始图: <a href='{$image['wm_url']}' target='_blank'>查看</a><br>";
echo "尺寸: {$image['IMAGE_DIMENSIONS']}, 大小: {$image['FILE_SIZE']} KB</p>\n";
}
}3. 遍历规格配置(注意:specifications 是索引数组,但通常只含 1 项)
if (isset($decode['result']['specifications']) && is_array($decode['result']['specifications'])) {
$specs = $decode['result']['specifications'][0]; // 取第一项(典型结构)
echo "<h3>关键配置:</h3>\n<ul>";
echo "<li>海景: " . ($specs['SEA_VIEW'] === '1' ? '✅ 是' : '❌ 否') . "</li>";
echo "<li>花园: " . ($specs['GARDEN'] === '1' ? '✅ 是' : '❌ 否') . "</li>";
echo "<li>露台: " . ($specs['TERRACE'] === '1' ? '✅ 是' : '❌ 否') . "</li>";
echo "<li>烧烤区: " . ($specs['BARBEKU'] === '1' ? '✅ 是' : '❌ 否') . "</li>";
echo "</ul>";
}❌ 常见错误及修正
你原代码中:
立即学习“PHP免费学习笔记(深入)”;
foreach ($decode->result as $result) { ... } // 错误!$decode 是数组,不能用 ->
foreach ($result->property as $data) { ... } // 错误!$result['property'] 是数组,非对象修正为:
// ✅ 正确:用 [] 访问数组,且 property 不是可遍历的数组
if (isset($decode['result']['property'])) {
$prop = $decode['result']['property'];
$property = [
'id' => $prop['PROPERTY_ID'] ?? 'N/A',
'sale' => $prop['SALE_RENT'] ?? 'N/A',
'title'=> $prop['PROPERTY_NAME_EN'] ?? 'N/A'
];
print_r($property);
}? 安全实践建议
-
始终检查键是否存在:使用
isset()或空合并运算符??防止未定义索引警告; -
验证数据类型:对可能为
null或非数组的字段,用is_array()二次校验; -
错误处理:API 调用后检查
curl_exec()返回值及 HTTP 状态码; -
调试技巧:使用
print_r($decode['result'])快速确认结构,而非完整var_dump。
通过严格遵循“数组用 []、对象用 ->”原则,并理解 JSON 层级的实际数据类型,你就能稳健地遍历任意复杂嵌套的 API 响应。



















