基于数组数据按当前时间填充HTML表格列的问题修正
问题:PHP数组生成时段统计表格修正
我来帮你搞定这个表格生成的问题!你需要根据当前时间把数组中的count值填充到对应时段列,同时按经销商分组展示状态数据,下面是修正后的方案:
问题回顾
原始数据数组
$dealerCount = [ [ 'dealer_id' => 5924, 'DealerName' => 'I Speed Motors', 'mmv_id' => 1, 'model_decision' => 'Straight Through', 'CCStatus' => 'CC Pending', 'created_at' => '2020-10-09 10:04:36', 'count' => 2 ], [ 'dealer_id' => 7942, 'DealerName' => 'Suriya Motors LLP', 'mmv_id' => 1, 'model_decision' => 'Referred to Credit', 'CCStatus' => 'CC Approved', 'created_at' => '2020-10-09 11:39:34', 'count' => 1 ], [ 'dealer_id' => 7942, 'DealerName' => 'Suriya Motors LLP', 'mmv_id' => 1, 'model_decision' => 'Form Received at Chola', 'CCStatus' => 'CC Rejected', 'created_at' => '2020-10-09 10:04:23', 'count' => 1 ] ];
错误输出表格
| Dealer Name | Status | 11.00am | 1.00pm | 3.00pm | 5.00pm | 7.00pm | 9.00pm |
|---|---|---|---|---|---|---|---|
| Suriya Motors LLP | CC Pending | ||||||
| CC Rejected | |||||||
| CC Expired | |||||||
| Referred to Credit | 1 | ||||||
| I Speed Motors | CC Pending | 2 | |||||
| CC Rejected | |||||||
| CC Expired | |||||||
| Suriya Motors LLP | CC Pending | ||||||
| CC Rejected | 1 | ||||||
| CC Expired |
期望输出表格(当前时间3.00pm)
| Dealer Name | Status | 11.00am | 1.00pm | 3.00pm | 5.00pm | 7.00pm | 9.00pm |
|---|---|---|---|---|---|---|---|
| Suriya Motors LLP | CC Pending | ||||||
| CC Rejected | 1 | ||||||
| CC Expired | |||||||
| Referred to Credit | 1 | ||||||
| I Speed Motors | CC Pending | 2 | |||||
| CC Rejected | |||||||
| CC Expired |
修正后的PHP代码
<?php // 定义时段列表,对应表格列的顺序 $timeSlots = ['11.00am', '1.00pm', '3.00pm', '5.00pm', '7.00pm', '9.00pm']; // 当前时间对应的时段(这里模拟为3.00pm,可替换为动态获取的当前时段) $currentTimeSlot = '3.00pm'; // 获取当前时段在列表中的索引,用于填充对应列 $slotIndex = array_search($currentTimeSlot, $timeSlots); // 先按经销商分组整理数据,避免重复输出经销商行 $groupedDealers = []; foreach ($dealerCount as $item) { $dealerName = $item['DealerName']; if (!isset($groupedDealers[$dealerName])) { // 初始化每个经销商的状态数据 $groupedDealers[$dealerName] = [ 'CC Pending' => '', 'CC Rejected' => '', 'CC Expired' => '', 'model_decision' => '', 'model_decision_count' => '' ]; } // 根据状态赋值到对应字段 switch ($item['CCStatus']) { case 'CC Approved': $groupedDealers[$dealerName]['model_decision'] = $item['model_decision']; $groupedDealers[$dealerName]['model_decision_count'] = $item['count']; break; case 'CC Pending': $groupedDealers[$dealerName]['CC Pending'] = $item['count']; break; case 'CC Rejected': $groupedDealers[$dealerName]['CC Rejected'] = $item['count']; break; case 'CC Expired': $groupedDealers[$dealerName]['CC Expired'] = $item['count']; break; } } // 构建HTML表格 $body = "<html> <head> <style> table, th, td { border: 1px solid black; border-collapse: collapse; text-align: center; } </style> </head> <body> <table> <tr> <th>Dealer Name</th><th>Status</th><th>11.00am</th><th>1.00pm</th><th>3.00pm</th><th>5.00pm</th><th>7.00pm</th><th>9.00pm</th> </tr>"; foreach ($groupedDealers as $dealerName => $statusData) { // 生成每行的时段列内容,默认空,只在当前时段填充值 $getSlotColumns = function($count) use ($slotIndex) { $columns = array_fill(0, 6, ''); if ($count !== '') { $columns[$slotIndex] = $count; } return implode('</td><td>', $columns); }; // 第一行:经销商名称+CC Pending $body .= "<tr> <td rowspan='4'>$dealerName</td><td>CC Pending</td><td>{$getSlotColumns($statusData['CC Pending'])}</td> </tr>"; // 第二行:CC Rejected $body .= "<tr> <td>CC Rejected</td><td>{$getSlotColumns($statusData['CC Rejected'])}</td> </tr>"; // 第三行:CC Expired $body .= "<tr> <td>CC Expired</td><td>{$getSlotColumns($statusData['CC Expired'])}</td> </tr>"; // 第四行:model_decision状态 $body .= "<tr> <td>{$statusData['model_decision']}</td><td>{$getSlotColumns($statusData['model_decision_count'])}</td> </tr>"; } $body .= "</table></body></html>"; echo $body; ?>
关键修正点
- 按经销商分组:先把原始数据按经销商名称分组,避免重复输出同一个经销商的多行表头,解决了错误输出中重复出现经销商的问题。
- 动态匹配时段列:通过
$timeSlots数组和$slotIndex,自动把count值填充到当前时间对应的列,不管当前时段是哪个,都能正确映射。 - 统一生成时段列:用匿名函数
getSlotColumns统一处理每行的时段列内容,确保只有当前时段列填充值,其他列为空。 - 正确使用rowspan:每个经销商只输出一次
rowspan='4'的单元格,后续行不再重复输出经销商名称,符合表格格式要求。
内容的提问来源于stack exchange,提问作者kumar
相关产品推荐
相关产品推荐

