0

0

将行式权限数据转换为列式展示的教程

霞舞

霞舞

发布时间:2025-11-02 11:07:01

|

851人浏览过

|

来源于php中文网

原创

将行式权限数据转换为列式展示的教程

本教程旨在解决如何将数据库中以行形式存储的用户-页面-权限数据,转换为以列形式展示的、更直观的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)的布尔标志数组。

发卡宝-卡密寄售系统
发卡宝-卡密寄售系统

发卡宝是一个专业的软件卡密等虚拟商品在线交易平台,拥有多种兑换方式,费率低,结算快,正规企业平台一直稳定运营,24小时不间断提供自动发卡服务。【模板说明】试用版自带一套模板(响应式)【环境支持】PHP环境 / 200M或以上空间大小 / 开启父路径 / 设置index.php为默认首页 / 目录写入权限需要开启【数据库】MySQL【安装步骤】将文件上传至空间目录,运行“http://域名/inst

下载
$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 '';
echo '';
echo '';

foreach ($sorted as $user => $pages) {
    foreach ($pages as $pagename => $perms) {
        echo "";
        echo ""; // 输出用户
        echo ""; // 输出页面

        // 遍历权限,输出对应的 'X' 或空字符串
        echo "";
        echo "";
        echo "";

        echo "";
    }
}

echo '';
echo '
UserPageReadEditDelete
" . htmlspecialchars($user) . "" . htmlspecialchars($pagename) . "" . ($perms['read'] ? "X" : "") . "" . ($perms['edit'] ? "X" : "") . "" . ($perms['delete'] ? "X" : "") . "
';

代码解释:

  1. 首先输出表格的头部 ,明确列的含义。
  2. 外层循环遍历 $sorted 数组,获取每个 $user 及其对应的 $pages 数据。
  3. 内层循环遍历每个 $pagename 及其对应的 $perms(权限布尔数组)。
  4. 在内层循环中,直接输出 user 和 pagename 的单元格。
  5. 接着,根据 $perms 数组中 read、edit、delete 键的布尔值,有条件地输出 "X" 或空字符串,这确保了权限列的准确对齐。
  6. 完整示例代码

    将数据预处理和渲染逻辑结合起来,形成一个完整的可执行示例:

     '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 '';
    
    echo '';
    echo '';
    echo '';
    
    foreach ($sorted as $user => $pages) {
        foreach ($pages as $pagename => $perms) {
            echo "";
            echo "";
            echo "";
    
            // 确保按照固定的顺序输出权限列,即使某些权限不存在
            echo "";
            echo "";
            echo "";
    
            echo "";
        }
    }
    
    echo '';
    echo '
    UserPageReadEditDelete
    " . htmlspecialchars($user) . "" . htmlspecialchars($pagename) . "" . ($perms['read'] ? "X" : "") . "" . ($perms['edit'] ? "X" : "") . "" . ($perms['delete'] ? "X" : "") . "
    '; ?>

    注意事项与总结

    1. 分离关注点: 这种“先处理数据,后渲染视图”的模式是MVC(Model-View-Controller)架构中的核心思想。它使得代码更易于理解、测试和维护。
    2. 可扩展性: 如果未来需要增加新的权限类型(例如“create”、“export”),只需在数据预处理阶段的初始化数组中添加新的键,并在渲染阶段增加对应的 输出即可,无需大幅修改现有逻辑。
    3. 安全性: 在输出用户提供的数据(如用户名、页面名)到HTML时,始终使用 htmlspecialchars() 函数进行转义,以防止跨站脚本攻击(XSS)。
    4. 性能考量: 对于非常庞大的数据集,预处理可能会占用一定的内存。但在大多数Web应用场景下,这种开销是可接受的,并且带来的代码清晰度和可维护性收益远大于此。如果数据量特别巨大,可以考虑使用数据库层面的PIVOT功能(如果数据库支持)来完成数据转换。
    5. 灵活性: 预处理后的 $sorted 数组不仅可以用于HTML表格渲染,还可以轻松地转换为JSON、XML或其他格式,满足不同的输出需求。
    6. 通过上述数据预处理和分步渲染的策略,我们能够优雅且高效地将行式权限数据转换为列式展示,极大地提升了代码的健壮性和可读性。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2678

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1659

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1515

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1419

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1488

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 8.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号