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

基于PHP数组生成透视表并输出行列交叉展示数据的HTML表格

解决方案

问题根源

你现有代码的核心问题是没有提前将原始数据按日期+姓名做聚合映射,直接遍历原始数组的每一行生成表格行,导致每个原始条目都会重复生成日期行、数值也无法对应到正确的姓名列,同时代码里引用了未定义的$unique_dates变量也会引发逻辑异常。

调整后完整代码

<?php
// 你的原始二维数组
$data = [
    ['date' => '04/2021', 'name' => 'Fred', 'value' => '12.00'],
    ['date' => '04/2021', 'name' => 'Tom', 'value' => '160.00'],
    ['date' => '04/2021', 'name' => 'Mike', 'value' => '9.00'],
    ['date' => '07/2021', 'name' => 'Tony', 'value' => '200.00'],
    ['date' => '07/2021', 'name' => 'Fred', 'value' => '43.00'],
    ['date' => '07/2021', 'name' => 'Tom', 'value' => '114.00'],
    ['date' => '07/2021', 'name' => 'Mike', 'value' => '28.00'],
];

// 1. 提取唯一姓名作为表格表头
$unique_names = array_unique(array_column($data, 'name'));
// 2. 提取唯一日期作为表格行维度
$unique_dates = array_unique(array_column($data, 'date'));
// 3. 初始化透视表结构,所有交叉位置默认填充0
$pivot_data = [];
foreach ($unique_dates as $date) {
    $pivot_data[$date] = array_fill_keys($unique_names, 0);
}
// 4. 将原始数据的实际值填充到透视表对应位置
foreach ($data as $item) {
    $pivot_data[$item['date']][$item['name']] = $item['value'];
}
?>

<table border="1" cellpadding="6" cellspacing="0">
<thead>
    <tr>
        <th>&nbsp;</th>
        <?php foreach ($unique_names as $name): ?>
            <th><?= htmlspecialchars($name) ?></th>
        <?php endforeach; ?>
    </tr>
</thead>
<tbody>
    <?php foreach ($pivot_data as $date => $value_row): ?>
    <tr>
        <td><?= htmlspecialchars($date) ?></td>
        <?php foreach ($value_row as $val): ?>
            <td><?= htmlspecialchars($val) ?></td>
        <?php endforeach; ?>
    </tr>
    <?php endforeach; ?>
</tbody>
</table>

逻辑说明

  • 提前构造好标准的透视结构,默认填充0,不需要在渲染阶段做复杂的存在性判断
  • 所有原始数据先做聚合映射,渲染阶段直接遍历处理好的结构化数据即可,不会出现列重复、值错位的问题
  • 增加htmlspecialchars处理输出内容,避免潜在的XSS安全问题

内容的提问来源于stack exchange,提问作者bhttoan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:06:01