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

Laravel解析含表头与明细的JSON并生成合并表格

问题描述

已完成两个JSON样本(销售表头、销售明细)的解析与表格渲染,但第三个同时包含表头与明细的JSON无法处理,希望沿用前序逻辑生成合并表格,目前卡在Controller的map函数返回值处理上。


示例1:销售表头解析

控制器代码

$data1 = '[{
      "T": {
          "HD": {
              "HD01": "1",
              "HD06": "20201006033942",
              "HD08": "3736803"
              }
          }
      },
      {
      "T": {
          "HD": {
              "HD01": "2",
              "HD06": "20201006035419",
              "HD08": "7523658"
              }
          }
      }]';

$json = json_decode($data1, true);

$head = collect($json)->map(function ($value) {
  return $value["T"]["HD"];
});

return view('dashboard.book.index', [
      'head' => $head
]);

Blade视图代码

<table class="table">
    <tr>
        <td>HD01</td>
        <td>HD02</td>
        <td>HD03</td>
        <td>HD04</td>
        <td>HD05</td>
        <td>HD06</td>
    </tr>
    @foreach ($head as $value)
        <tr>
            <td>{{ $value['HD01'] }}</td>
            <td>{{ $value['HD02'] }}</td>
            <td>{{ $value['HD03'] }}</td>
            <td>{{ $value['HD04'] }}</td>
            <td>{{ $value['HD05'] }}</td>
            <td>{{ $value['HD06'] }}</td>
        </tr>
    @endforeach
</table>

示例2:销售明细解析

控制器代码

$data2 = '[{
    "T": {
      "SIEL" : {
              "SIE" : [
                  {
                      "sequenceNumber" : 0,
                      "itemId" : "3010",
                      "itemDescription" : "BAN VACCINE COSTELLET",
                      "unitAmount" : 29950,
                      "quantity" : 1.405,
                      "subTotalAmount" : 42080,
                      "discountAmount" : 0,
                      "totalAmount" : 42080
                  },
                  {
                      "sequenceNumber" : 1,
                      "itemId" : "1010",
                      "itemDescription" : "CROLETA COOKIE",
                      "unitAmount" : 4800,
                      "quantity" : 0.605,
                      "subTotalAmount" : 2904,
                      "discountAmount" : 0,
                      "totalAmount" : 2904
                  }
              ]
          }
      }
  },
  {
  "T": {
    "SIEL" : {
            "SIE" : [
                {
                    "sequenceNumber" : 0,
                    "itemId" : "3010",
                    "itemDescription" : "BAN VACCINE COSTELLET",
                    "unitAmount" : 29950,
                    "quantity" : 1.405,
                    "subTotalAmount" : 42080,
                    "discountAmount" : 0,
                    "totalAmount" : 42080
                },
                {
                    "sequenceNumber" : 1,
                    "itemId" : "1010",
                    "itemDescription" : "CROLETA COOKIE",
                    "unitAmount" : 4800,
                    "quantity" : 0.605,
                    "subTotalAmount" : 2904,
                    "discountAmount" : 0,
                    "totalAmount" : 2904
                }
            ]
        }
    }
}]';

$json = json_decode($data2, true);

$details = collect($json)->map(function ($value) {
  return $value["T"]["SIEL"]["SIE"];
});

return view('dashboard.book.index', [
     'details' => $details
]);

Blade视图代码

<table class="table">
    <tr>            
        <td>sequenceNumber</td>
        <td>itemId</td>
        <td>itemDescription</td>
        <td>unitAmount</td>
        <td>quantity</td>
        <td>subTotalAmount</td>
        <td>discountAmount</td>
        <td>totalAmount</td>
    </tr>

    @foreach ($details as $items)
        @foreach ($items as $value)
            <tr>                    
                <td>{{ $value['sequenceNumber'] }}</td>
                <td>{{ $value['itemId'] }}</td>
                <td>{{ $value['itemDescription'] }}</td>
                <td>{{ $value['unitAmount'] }}</td>
                <td>{{ $value['quantity'] }}</td>
                <td>{{ $value['subTotalAmount'] }}</td>
                <td>{{ $value['discountAmount'] }}</td>
                <td>{{ $value['totalAmount'] }}</td>
            </tr>
        @endforeach
    @endforeach
</table>    

示例3:表头+明细合并解析解决方案

控制器代码

调整map函数,将每个订单的表头与明细关联,返回包含两者的数组:

$data3 = '[
    {
       "T":{
          "HD":{
             "HD01":"1",
             "HD02":"20201007",
             "HD03":"1001",
             "HD04":"15",
             "HD05":140,
             "HD06":"20201007062511",
             "HD07":"",
             "HD08":"3514401",
             "HD09":"PYG",
             "HD10":"PYG",
             "HD11":"00000 A000005",
             "HD12":"",
             "HD13":"",
             "HD14":"",
             "HD15":"",
             "HD16":"",
             "HD17":"Insufficient Funds",
             "HD18":"",
             "HD19":"",
             "HD20":"",
             "HD21":0,
             "HD22":"ICAE",
             "HD23":false,
             "HD24":false,
             "HD26":0
          },
          "SIEL":{
             "SIE":[
                {
                   "sequenceNumber":0,
                   "itemId":"1159",
                   "itemDescription":"BREAD FOR PANCHO",
                   "unitAmount":3500,
                   "quantity":0.001,
                   "subTotalAmount":4,
                   "discountAmount":0,
                   "totalAmount":4
                },
                {
                   "sequenceNumber":1,
                   "itemId":"2098",
                   "itemDescription":"HAPPY DAY CAKE",
                   "unitAmount":28950,
                   "quantity":0.001,
                   "subTotalAmount":29,
                   "discountAmount":0,
                   "totalAmount":29
                }
             ]
          }
       }
    },
    {
       "T":{
          "HD":{
             "HD01":"1",
             "HD02":"20201007",
             "HD03":"1001",
             "HD04":"15",
             "HD05":141,
             "HD06":"20201007063358",
             "HD07":"",
             "HD08":"3514401",
             "HD09":"PYG",
             "HD10":"PYG",
             "HD11":"0010580000125",
             "HD12":"",
             "HD13":"",
             "HD14":"",
             "HD15":"",
             "HD16":"",
             "HD17":"",
             "HD18":"",
             "HD19":"",
             "HD20":"",
             "HD21":16100,
             "HD22":"ICAE",
             "HD23":false,
             "HD24":false,
             "HD26":-47
          },
          "SIEL":{
             "SIE":[
                {
                   "sequenceNumber":0,
                   "itemId":"1110",
                   "itemDescription":"STICK WITHOUT ANISE",
                   "unitAmount":9100,
                   "quantity":1.115,
                   "subTotalAmount":10147,
                   "discountAmount":0,
                   "totalAmount":10147                   
                },
                {
                   "sequenceNumber":1,
                   "itemId":"7841503001513",
                   "itemDescription":"TRIPACK CRACKER CLASS",
                   "unitAmount":6000,
                   "quantity":1,
                   "subTotalAmount":6000,
                   "discountAmount":0,
                   "totalAmount":6000                 
                }
             ]
          }
       }
    }
 ]';

$json = json_decode($data3, true);

$tickets = collect($json)->map(function ($value) {
    return [
        'header' => $value["T"]["HD"],
        'details' => $value["T"]["SIEL"]["SIE"]
    ];
});

return view('dashboard.book.index', [
    'tickets' => $tickets
]);

Blade视图代码(跨列合并样式)

渲染时先输出订单表头(跨明细列),再输出对应明细行:

<table class="table">
    <!-- 全局表头:包含表头和明细字段 -->
    <tr>
        <td>HD01</td>
        <td>HD02</td>
        <td>HD03</td>
        <td>HD04</td>
        <td>HD05</td>
        <td>HD06</td>
        <td>sequenceNumber</td>
        <td>itemId</td>
        <td>itemDescription</td>
        <td>unitAmount</td>
        <td>quantity</td>
        <td>subTotalAmount</td>
        <td>discountAmount</td>
        <td>totalAmount</td>
    </tr>

    @foreach ($tickets as $ticket)
        <!-- 订单表头行:跨8个明细列 -->
        <tr>
            <td>{{ $ticket['header']['HD01'] }}</td>
            <td>{{ $ticket['header']['HD02'] }}</td>
            <td>{{ $ticket['header']['HD03'] }}</td>
            <td>{{ $ticket['header']['HD04'] }}</td>
            <td>{{ $ticket['header']['HD05'] }}</td>
            <td>{{ $ticket['header']['HD06'] }}</td>
            <td colspan="8">订单明细</td>
        </tr>
        <!-- 订单明细行:表头字段留空 -->
        @foreach ($ticket['details'] as $detail)
            <tr>
                <td colspan="6"></td>
                <td>{{ $detail['sequenceNumber'] }}</td>
                <td>{{ $detail['itemId'] }}</td>
                <td>{{ $detail['itemDescription'] }}</td>
                <td>{{ $detail['unitAmount'] }}</td>
                <td>{{ $detail['quantity'] }}</td>
                <td>{{ $detail['subTotalAmount'] }}</td>
                <td>{{ $detail['discountAmount'] }}</td>
                <td>{{ $detail['totalAmount'] }}</td>
            </tr>
        @endforeach
    @endforeach
</table>

可选方案:每条明细携带完整表头

如果需要每条明细都显示完整表头信息,修改控制器map函数:

$tickets = collect($json)->flatMap(function ($value) {
    $header = $value["T"]["HD"];
    return collect($value["T"]["SIEL"]["SIE"])->map(function ($detail) use ($header) {
        return array_merge($header, $detail);
    });
});

对应Blade视图直接遍历输出:

<table class="table">
    <tr>
        <td>HD01</td>
        <td>HD02</td>
        <td>HD03</td>
        <td>HD04</td>
        <td>HD05</td>
        <td>HD06</td>
        <td>sequenceNumber</td>
        <td>itemId</td>
        <td>itemDescription</td>
        <td>unitAmount</td>
        <td>quantity</td>
        <td>subTotalAmount</td>
        <td>discountAmount</td>
        <td>totalAmount</td>
    </tr>

    @foreach ($tickets as $item)
        <tr>
            <td>{{ $item['HD01'] }}</td>
            <td>{{ $item['HD02'] }}</td>
            <td>{{ $item['HD03'] }}</td>
            <td>{{ $item['HD04'] }}</td>
            <td>{{ $item['HD05'] }}</td>
            <td>{{ $item['HD06'] }}</td>
            <td>{{ $item['sequenceNumber'] }}</td>
            <td>{{ $item['itemId'] }}</td>
            <td>{{ $item['itemDescription'] }}</td>
            <td>{{ $item['unitAmount'] }}</td>
            <td>{{ $item['quantity'] }}</td>
            <td>{{ $item['subTotalAmount'] }}</td>
            <td>{{ $item['discountAmount'] }}</td>
            <td>{{ $item['totalAmount'] }}</td>
        </tr>
    @endforeach
</table>

内容的提问来源于stack exchange,提问作者Adolfi Téllez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:57:38