使用PHP与MySQL生成嵌套JSON时的格式问题求助
解决嵌套JSON格式问题:先重组PHP数组再编码
你现在得到的是扁平JSON结构,因为数据库查询返回的是每条记录独立的行,json_encode()会直接把这个扁平结果集转成一维数组的JSON。要得到期望的嵌套格式,得先在PHP里把数据按城市分组,构建嵌套数组,再进行JSON编码。
下面是修改后的完整代码(假设用PDO连接数据库,如果是mysqli我也会附上适配版本):
<?php function data() { global $db; // 确保$db是已初始化的数据库连接 $runDistanceBasedOnCityQuery = "SELECT rc.id, rc.cityId, c.cityName, rc.runId, r.distance, rc.status FROM run_city rc INNER JOIN cities c ON c.id = rc.cityId INNER JOIN run_distance r ON r.id = rc.runId ORDER BY c.cityName"; // 执行查询并获取结果(PDO版本) $stmt = $db->prepare($runDistanceBasedOnCityQuery); $stmt->execute(); $flatResults = $stmt->fetchAll(PDO::FETCH_ASSOC); // 重组为嵌套数组 $nestedData = []; $cityLookup = []; // 快速定位城市在数组中的索引,避免重复创建城市条目 foreach ($flatResults as $row) { $cityId = $row['cityId']; // 如果该城市还没加入嵌套数组,先创建城市条目 if (!isset($cityLookup[$cityId])) { $cityEntry = [ 'cityId' => $cityId, 'cityName' => $row['cityName'], 'runs' => [] // 存放该城市下的所有跑步记录 ]; $cityLookup[$cityId] = count($nestedData); $nestedData[] = $cityEntry; } // 提取当前跑步记录的信息,加入对应城市的runs数组 $runEntry = [ 'id' => $row['id'], 'runId' => $row['runId'], 'distance' => $row['distance'], 'status' => $row['status'] ]; $nestedData[$cityLookup[$cityId]]['runs'][] = $runEntry; } // 编码为JSON,JSON_PRETTY_PRINT可选,用于格式化输出方便阅读 return json_encode($nestedData, JSON_PRETTY_PRINT); } ?>
如果用mysqli连接数据库,替换结果获取部分:
// mysqli版本的结果获取 $stmt = $db->prepare($runDistanceBasedOnCityQuery); $stmt->execute(); $resultSet = $stmt->get_result(); $flatResults = []; while ($row = $resultSet->fetch_assoc()) { $flatResults[] = $row; }
关键逻辑说明:
- 分组去重:用
$cityLookup数组记录每个城市ID对应的$nestedData索引,确保同一个城市只创建一个条目,避免重复。 - 嵌套结构:每个城市条目包含基础信息(cityId、cityName)和一个
runs数组,所有属于该城市的跑步记录都会被放进这个数组里。 - JSON编码:最后对重组后的嵌套数组执行
json_encode(),就能得到你想要的层级分明的JSON格式了。
内容的提问来源于stack exchange,提问作者hushie
相关产品推荐
相关产品推荐

