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); ?>
关键逻辑说明
- 分组去重:用
$packetsTemp数组以packet的id为键,确保同一个packet不管返回多少行(其实左连接最多一行),只会创建一个对象,避免重复。 - 兼容左连接空值:因为是
LEFT JOIN,部分packet可能没有对应的measurement,这里通过判断字段是否为NULL,避免把无效的空值塞进子结构里。 - 结构转换:最后用
array_values()把关联数组转成索引数组,完全匹配你想要的packet数组格式。
这样处理后,就能生成你期望的嵌套JSON结构了。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

