
本教程旨在解决如何将数据库中以行形式存储的用户-页面-权限数据,转换为以列形式展示的、更直观的html表格。通过采用数据预处理策略,将原始数据重构为嵌套的关联数组,然后利用清晰的循环逻辑生成html输出,从而避免了在渲染阶段处理复杂条件判断和状态管理,确保了列的准确对齐和代码的可维护性。
在Web应用开发中,我们经常需要将扁平化的数据结构转换为更具洞察力的视图。一个常见的场景是,权限信息可能以多行记录的形式存储,每行包含用户、页面和单个权限。然而,在前端展示时,我们通常希望将同一用户和同一页面的所有权限聚合到一行中,并将不同的权限类型(如“read”、“edit”、“delete”)作为独立的列来呈现。
假设我们有以下PHP数组 $data,它模拟了从数据库查询出的原始权限数据:
$data = [
    ['user' => 'Jon', 'page' => 'books', 'permission' => 'read'],
    ['user' => 'Jon', 'page' => 'books', 'permission' => 'delete'],
    ['user' => 'Jon', 'page' => 'photos', 'permission' => 'read'],
    ['user' => 'Jon', 'page' => 'photos', 'permission' => 'edit'],
];这种结构清晰地记录了每个用户在每个页面上的具体权限。
我们期望的HTML表格输出应该像这样,其中权限类型转换为列,并用“X”标记表示拥有该权限:
user | page | read | edit | delete ----------------------------------------------- Jon | books | X | | X Jon | photos | X | X |
直接在渲染循环中尝试通过复杂的条件判断和状态变量来生成上述结构,往往会导致代码难以理解和维护,并且容易出现列错位等问题。例如,原始尝试中通过比较当前行与上一行的user和page来决定是否输出新行或新单元格,这种方法在处理多列权限时极易出错。
解决此类问题的最佳实践是分离数据处理逻辑与视图渲染逻辑。这意味着我们应该首先将原始数据重构为更适合渲染的中间结构,然后再进行视图层的迭代输出。
我们将原始的扁平数据 $data 转换为一个嵌套的关联数组 $sorted。这个新结构将以用户名为第一层键,页面名为第二层键,最内层则是一个包含所有可能权限(read, edit, delete)的布尔标志数组。
$sorted = [];
foreach ($data as $row) {
    // 如果用户不存在,则初始化用户对应的数组
    if (!isset($sorted[$row['user']])) {
        $sorted[$row['user']] = [];
    }
    // 如果页面不存在,则初始化页面对应的权限数组,并默认所有权限为false
    if (!isset($sorted[$row['user']][$row['page']])) {
        $sorted[$row['user']][$row['page']] = [
            'read' => false,
            'edit' => false,
            'delete' => false
        ];
    }
    // 根据当前行的权限,将其对应的布尔标志设为 true
    $sorted[$row['user']][$row['page']][$row['permission']] = true;
}经过预处理后,$sorted 数组的结构将如下所示(简化表示):
[
    'Jon' => [
        'books' => [
            'read' => true,
            'edit' => false,
            'delete' => true
        ],
        'photos' => [
            'read' => true,
            'edit' => true,
            'delete' => false
        ]
    ]
]这种结构清晰地表达了每个用户在每个页面上拥有的具体权限,并且所有权限类型都已标准化。
有了 $sorted 数组,渲染HTML表格变得非常简单和直观。我们只需要两层循环:外层遍历用户,内层遍历用户的页面及其权限。
echo '<table>';
echo '<thead><tr><th>User</th><th>Page</th><th>Read</th><th>Edit</th><th>Delete</th></tr></thead>';
echo '<tbody>';
foreach ($sorted as $user => $pages) {
    foreach ($pages as $pagename => $perms) {
        echo "<tr>";
        echo "<td>" . htmlspecialchars($user) . "</td>"; // 输出用户
        echo "<td>" . htmlspecialchars($pagename) . "</td>"; // 输出页面
        // 遍历权限,输出对应的 'X' 或空字符串
        echo "<td>" . ($perms['read'] ? "X" : "") . "</td>";
        echo "<td>" . ($perms['edit'] ? "X" : "") . "</td>";
        echo "<td>" . ($perms['delete'] ? "X" : "") . "</td>";
        echo "</tr>";
    }
}
echo '</tbody>';
echo '</table>';代码解释:
将数据预处理和渲染逻辑结合起来,形成一个完整的可执行示例:
<?php
// 原始数据
$data = [
    ['user' => 'Jon', 'page' => 'books', 'permission' => 'read'],
    ['user' => 'Jon', 'page' => 'books', 'permission' => 'delete'],
    ['user' => 'Jon', 'page' => 'photos', 'permission' => 'read'],
    ['user' => 'Jon', 'page' => 'photos', 'permission' => 'edit'],
    // 更多数据...
];
// --- 数据预处理阶段 ---
$sorted = [];
foreach ($data as $row) {
    if (!isset($sorted[$row['user']])) {
        $sorted[$row['user']] = [];
    }
    if (!isset($sorted[$row['user']][$row['page']])) {
        // 确保所有可能的权限类型都被初始化,即使它们在原始数据中没有出现
        $sorted[$row['user']][$row['page']] = [
            'read' => false,
            'edit' => false,
            'delete' => false
            // 如果有更多权限,在此处添加并初始化
        ];
    }
    $sorted[$row['user']][$row['page']][$row['permission']] = true;
}
// --- 视图渲染阶段 ---
echo '<style>
    table { width: 100%; border-collapse: collapse; }
    th, td { border: 1px solid #ccc; padding: 8px; text-align: left; }
    th { background-color: #f2f2f2; }
</style>';
echo '<table>';
echo '<thead><tr><th>User</th><th>Page</th><th>Read</th><th>Edit</th><th>Delete</th></tr></thead>';
echo '<tbody>';
foreach ($sorted as $user => $pages) {
    foreach ($pages as $pagename => $perms) {
        echo "<tr>";
        echo "<td>" . htmlspecialchars($user) . "</td>";
        echo "<td>" . htmlspecialchars($pagename) . "</td>";
        // 确保按照固定的顺序输出权限列,即使某些权限不存在
        echo "<td>" . ($perms['read'] ? "X" : "") . "</td>";
        echo "<td>" . ($perms['edit'] ? "X" : "") . "</td>";
        echo "<td>" . ($perms['delete'] ? "X" : "") . "</td>";
        echo "</tr>";
    }
}
echo '</tbody>';
echo '</table>';
?>通过上述数据预处理和分步渲染的策略,我们能够优雅且高效地将行式权限数据转换为列式展示,极大地提升了代码的健壮性和可读性。
以上就是将行式权限数据转换为列式展示的教程的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号