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

