You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:17:20