如何在PHP的foreach循环中正确将多表数据编码为单个JSON字符串
如何在PHP的foreach循环中正确将多表数据编码为单个JSON字符串
嘿,我来帮你搞定这个多表数据合并成单个JSON的问题!看你现在的代码只处理了tickets表的部分数据,还没关联另外两个表,咱们一步步来完善它。
首先核心思路很简单:先把主表(也就是你的tickets表)的每条记录捞出来,然后在循环每一条主表记录的时候,根据关联字段去查询另外两个表的数据,把这些子表的数据合并到当前主表的数组里,最后把所有处理好的记录统一转成JSON就行。
假设你的另外两个表分别是ticket_details(存储每张票的明细项,关联字段是InvoiceNo)和salesman_extra(存储销售的额外信息,关联字段是SalesMan),咱们来补全并优化代码:
完整实现代码
<?php // 确保你的数据库连接$con已经正常建立 $batch = "你的批次标识"; // 替换成实际的批次变量 // 1. 查询主表tickets的未完成记录 $query1 = "SELECT Dept, InvoiceNo, BackRef, InvoiceDate, SalesMan, completed FROM tickets WHERE batch='$batch' AND completed='0'"; $result1 = mysqli_query($con, $query1) or die(mysqli_error($con)); $finalData = []; if (mysqli_num_rows($result1) > 0) { // 2. 循环处理每一条主表记录 while ($ticketData = mysqli_fetch_assoc($result1)) { $invoiceNo = $ticketData['InvoiceNo']; $salesManId = $ticketData['SalesMan']; // 3. 关联查询第一个子表:票的明细数据 $detailQuery = "SELECT item_name, quantity, unit_price FROM ticket_details WHERE InvoiceNo='$invoiceNo'"; $detailResult = mysqli_query($con, $detailQuery) or die(mysqli_error($con)); // 把明细数据作为子数组存入当前ticket记录 $ticketData['ticket_items'] = mysqli_fetch_all($detailResult, MYSQLI_ASSOC); // 4. 关联查询第二个子表:销售的额外信息 $salesmanQuery = "SELECT contact_phone, email FROM salesman_extra WHERE SalesMan='$salesManId'"; $salesmanResult = mysqli_query($con, $salesmanQuery) or die(mysqli_error($con)); // 把销售额外信息存入当前ticket记录 $ticketData['salesman_info'] = mysqli_fetch_assoc($salesmanResult); // 5. 把处理好的单条ticket记录加入总数据数组 $finalData[] = $ticketData; } } // 6. 将合并后的数组编码为JSON字符串,添加参数优化输出 $jsonString = json_encode($finalData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); echo $jsonString; ?>
几个关键注意点
- 关联字段要精准:一定要保证子表和主表的关联字段(比如
InvoiceNo)完全匹配,不然会查不到对应的数据。 - SQL注入风险规避:上面的代码为了贴合你的原始写法用了字符串拼接,实际项目里强烈建议使用预处理语句(比如
mysqli_prepare),避免注入攻击。 - 空结果兼容:如果子表没有对应数据,
mysqli_fetch_all会返回空数组,mysqli_fetch_assoc会返回null,这些都会被JSON正确解析,不会报错。 - JSON编码优化:
JSON_UNESCAPED_UNICODE能让中文等非ASCII字符正常显示,JSON_PRETTY_PRINT会让JSON格式更规整,方便调试。
要是你的另外两个表结构不同,只需要调整子表的查询语句,以及修改存入$ticketData数组的键名就行,核心逻辑都是循环主表、嵌套查子表、合并数据、统一转JSON。
备注:内容来源于stack exchange,提问作者Keith Holm
相关产品推荐
相关产品推荐

