基于数组动态构建表格:列数据与表头匹配问题修正
解决数组数据与表格表头不匹配的问题
我看到你遇到的问题了——表格里的列数据和表头对应不上,Item03、04的R2020_03数据错误显示在R2018_04列。这是因为你当前的代码是直接遍历每个Item自己的子数组来输出单元格,而不是按照表头的固定顺序去匹配对应的数据。
问题根源
你的代码在处理每个Item时,循环的是该Item自身的键值对(比如Item03只有R2020_03这一个键),然后直接输出对应的<td>。但表头是固定顺序的R2018_04→R2019_B2→R2020_03→No Data,所以必须按表头的顺序遍历,逐个匹配Item中的数据,而不是反过来。
解决方案
核心思路是:先获取表头的所有键(保留顺序),然后对每个Item,按表头的顺序逐个检查是否有对应的数据,没有就输出空单元格或占位符,有就输出对应的值。
修改后的完整代码如下:
// 先获取表头的键数组(保留顺序,这是关键) $headerKeys = array_keys($tab2['head']); $totalColumns = count($headerKeys); // build the table $output = '<table style="border: 1px solid #333; width:100%; font-family:calibri, Arial, Helvetica, sans-serif;">'; $output .= '<thead><tr>'; $output .= '<th style="text-align:center; width: 30%; border-bottom: 1px solid #333;">Kpi</th>'; foreach ($tab2['head'] as $value) { $output .= '<th style="text-align:left; border-bottom: 1px solid #333;">'.$value.'</th>'; } $output .= '</tr></thead> '; foreach ($tab2 as $key => $itemData) { if($key != 'head'){ $output .= '<tr>'; $output .= '<td style="text-align:left;">'.$key.'</td>'; // 按表头顺序遍历每一列 foreach ($headerKeys as $colKey) { // 检查当前Item是否有该列的数据 if (isset($itemData[$colKey])) { $v = $itemData[$colKey]; // 处理状态和样式 switch ($v['response']) { case 1: $status = 'Pass'; $kpi_value = $v['value']; $style = "green"; break; case 0: $status = 'Fail'; $kpi_value = $v['value']; $style = "red"; break; case 2: $status = 'N/A'; $style = "orange"; break; default: $status = 'N/A'; $kpi_value = ''; $style = ''; break; } if($status == 'N/A'){ $output .= '<td style="text-align:center; background-color:'.$style.'">'.$status.'</td>'; }else{ $output .= '<td style="text-align:center; color: white; background-color:'.$style.';">'.$kpi_value.'</td>'; } } else { // 如果当前Item没有该列数据,判断是否是"No Data"列 if ($colKey === 'No Data') { $output .= '<td style="text-align:center;"></td>'; } else { // 对于非"No Data"列,检查是否属于"No Data"的Item(即Item只有No Data键) $isNoDataItem = isset($itemData['No Data']); $output .= '<td style="text-align:center;">'.($isNoDataItem ? '-' : '').'</td>'; } } } $output .= '</tr>'; } } $output .= '</table>'; return $output;
关键改动说明
- 获取表头键数组:用
array_keys($tab2['head'])拿到表头的键并保留顺序,确保后续遍历是按表头的列顺序来的。 - 按表头顺序遍历列:处理每个Item时,不再遍历Item自己的子数组,而是遍历表头的键数组,逐个匹配数据。
- 空单元格处理:如果Item没有当前列的数据,根据列类型输出空或
-(比如No Data的Item,前面三列输出-)。
这样修改后,生成的表格就会和你预期的一致:Item03、04的4会正确显示在R2020_03列,其他列也会对应正确。
内容的提问来源于stack exchange,提问作者Jean-Philippe SANTOS DE JESUS
相关产品推荐
相关产品推荐

