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

