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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:24:33