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

基于数组动态构建表格:列数据与表头匹配问题修正

解决数组数据与表格表头不匹配的问题

我看到你遇到的问题了——表格里的列数据和表头对应不上,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;

关键改动说明

  1. 获取表头键数组:用array_keys($tab2['head'])拿到表头的键并保留顺序,确保后续遍历是按表头的列顺序来的。
  2. 按表头顺序遍历列:处理每个Item时,不再遍历Item自己的子数组,而是遍历表头的键数组,逐个匹配数据。
  3. 空单元格处理:如果Item没有当前列的数据,根据列类型输出空或-(比如No Data的Item,前面三列输出-)。

这样修改后,生成的表格就会和你预期的一致:Item03、04的4会正确显示在R2020_03列,其他列也会对应正确。

内容的提问来源于stack exchange,提问作者Jean-Philippe SANTOS DE JESUS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:48:25