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
相关产品推荐
相关产品推荐

