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

PHP实现多行转多列输出权限表时多余单元格问题排查

问题核心原因

你的现有逻辑是逐行遍历原始权限数据,没有提前对同user+page的权限做聚合,导致多个结构问题:

  • 单条原始数据只会输出当前permission对应的<td>,其余权限对应的列没有输出空<td>占位,直接导致每行单元格总数和表头列数不匹配,出现错位/多余单元格
  • <tr>和</tr>的闭合逻辑错误:同一user+page对应的多条原始数据,只有第一条会输出<tr>,最后一条不会触发</tr>输出,标签不闭合会导致浏览器自动补全错误结构
  • 额外的Create权限、role字段判断属于冗余逻辑,和你的需求不匹配,也会额外生成不需要的单元格

正确实现方案

先对原始数据做聚合预处理,再输出表格即可避免上述问题:

// 第一步:聚合数据,以user+page为唯一键,整理每个组合的权限情况
$aggregated = [];
foreach ($data as $row) {
    $key = $row['user'] . '|' . $row['page'];
    if (!isset($aggregated[$key])) {
        $aggregated[$key] = [
            'user' => $row['user'],
            'page' => $row['page'],
            'read' => false,
            'edit' => false,
            'delete' => false,
        ];
    }
    // 标记对应权限是否存在
    if (isset($aggregated[$key][$row['permission']])) {
        $aggregated[$key][$row['permission']] = true;
    }
}

// 第二步:遍历聚合后的数据输出表格
echo '<table>';
// 输出表头
echo '<tr><th>user</th><th>page</th><th>read</th><th>edit</th><th>delete</th></tr>';
foreach ($aggregated as $row) {
    echo '<tr>';
    echo '<th>' . htmlspecialchars($row['user']) . '</th>';
    echo '<td>' . htmlspecialchars($row['page']) . '</td>';
    echo '<td>' . ($row['read'] ? 'X' : '') . '</td>';
    echo '<td>' . ($row['edit'] ? 'X' : '') . '</td>';
    echo '<td>' . ($row['delete'] ? 'X' : '') . '</td>';
    echo '</tr>';
}
echo '</table>';

这种方式会保证每行的单元格数量固定,标签完全闭合,不会出现多余/错位的单元格问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:45:03