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

PHP中如何将MySQLi关联查询的多行数据合并为指定结构的单个JSON对象

解决MySQLi查询结果转嵌套JSON结构的问题

我来帮你搞定这个嵌套JSON生成的问题~你现在的核心困扰是左连接返回的多行数据,没法把关联的measurements字段打包成每个packet里的子对象对吧?下面给你调整代码,完美实现你想要的结构。

问题根源

你的左连接查询会把每个packet和它对应的measurement拼成一行返回:如果packet有关联的measurement,行里会包含两边的字段;如果没有,measurement相关字段就是NULL。你原来的代码只提取了packet的基础字段,完全没处理measurement的嵌套逻辑,自然生成不了目标结构。

修改后的完整代码

<?php
// 初始化最终响应的结构
$response = ["packet" => []];
// 用临时数组按packet的id分组存储,避免重复创建同一个packet对象
$packetsTemp = [];

if ($result != NULL) {
    while ($row = $result->fetch_assoc()) {
        $packetId = $row["id"];
        
        // 如果当前packet还没被处理过,先创建基础结构
        if (!isset($packetsTemp[$packetId])) {
            $packetsTemp[$packetId] = [
                "id" => $row["id"],
                "pi_id" => $row["pi_id"],
                "rcv_counter" => $row["rcv_counter"],
                "rcv_RSSI" => $row["rcv_RSSI"],
                "tag_id" => $row["tag_id"],
                "measurement" => [] // 先初始化空的measurement子结构
            ];
        }
        
        // 处理measurement字段:只有当存在有效数据时才赋值(兼容左连接的NULL情况)
        if ($row["measurement1"] !== null || $row["measurement2"] !== null) {
            $packetsTemp[$packetId]["measurement"] = [
                "measurement1" => $row["measurement1"],
                "measurement2" => $row["measurement2"]
            ];
        }
    }
    
    // 把分组后的关联数组转成索引数组,匹配目标JSON的结构
    $response["packet"] = array_values($packetsTemp);
}

// 生成格式化后的JSON输出
echo json_encode($response, JSON_PRETTY_PRINT);
?>

关键逻辑说明

  1. 分组去重:用$packetsTemp数组以packet的id为键,确保同一个packet不管返回多少行(其实左连接最多一行),只会创建一个对象,避免重复。
  2. 兼容左连接空值:因为是LEFT JOIN,部分packet可能没有对应的measurement,这里通过判断字段是否为NULL,避免把无效的空值塞进子结构里。
  3. 结构转换:最后用array_values()把关联数组转成索引数组,完全匹配你想要的packet数组格式。

这样处理后,就能生成你期望的嵌套JSON结构了。

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:52:41