在开发后台管理系统或者权限管理模块时,权限控制通常是不可或缺的一部分。一个典型的场景是,系统中存在一套完整的权限列表,而每个用户只被授予其中的一部分权限。为了在展示界面或执行功能前有效地过滤掉用户没有的权限,我们需要一种既准确又高效的方法进行权限筛选。PHP 提供的 array_diff_ukey() 函数,正好可以在某些场景下实现这种权限过滤。
本文将通过一个实际示例,演示如何利用 array_diff_ukey() 高效地实现用户权限过滤。
假设系统定义了一组完整权限:
$allPermissions = [
'user.view' => '查看用户',
'user.edit' => '编辑用户',
'post.view' => '查看文章',
'post.edit' => '编辑文章',
'admin.panel' => '访问后台',
];
而某个普通用户的权限如下:
$userPermissions = [
'user.view' => true,
'post.view' => true,
];
我们希望得到该用户不拥有的权限列表,用于日志记录、安全检查或权限提示等功能。
array_diff_ukey() 函数的作用是:比较两个数组的键名,并使用回调函数进行自定义比较,返回存在于第一个数组而不存在于其他数组中的键值对。
我们可以用它来获取 $allPermissions 中,用户未拥有的权限项:
$diff = array_diff_ukey(
$allPermissions,
$userPermissions,
function($key1, $key2) {
return strcmp($key1, $key2);
}
);
上述代码中,$diff 将返回一个数组,包含所有用户未拥有的权限:
[
'user.edit' => '编辑用户',
'post.edit' => '编辑文章',
'admin.panel' => '访问后台',
]
设想我们有一个权限配置页面,向管理员展示某个用户的权限缺失项,以便进行调整。我们可以这样实现:
function getMissingPermissions(array $allPermissions, array $userPermissions): array {
return array_diff_ukey(
$allPermissions,
$userPermissions,
fn($a, $b) => strcmp($a, $b)
);
}
// 所有权限
$allPermissions = [
'user.view' => '查看用户',
'user.edit' => '编辑用户',
'post.view' => '查看文章',
'post.edit' => '编辑文章',
'admin.panel' => '访问后台',
];
// 用户拥有的权限
$userPermissions = [
'user.view' => true,
'post.view' => true,
];
// 获取缺失权限
$missing = getMissingPermissions($allPermissions, $userPermissions);
// 输出结果
foreach ($missing as $code => $desc) {
echo "缺失权限: $desc ($code)" . PHP_EOL;
}
输出结果为:
缺失权限: 编辑用户 (user.edit)
缺失权限: 编辑文章 (post.edit)
缺失权限: 访问后台 (admin.panel)
权限审核系统:在审核用户权限配置时快速找出缺失项。
差异日志记录:记录用户权限变更前后差异。
前端权限树筛选:动态构建用户未授权的功能项,供前端处理。
URL权限校验:配合路由权限标识,实现访问控制。例如:
$permissions = [
'/dashboard' => '访问仪表盘',
'/admin/users' => '管理用户',
'/admin/settings' => '系统设置',
];
$userPermissions = [
'/dashboard' => true,
];
$unauthorized = array_diff_ukey($permissions, $userPermissions, 'strcmp');
foreach ($unauthorized as $url => $desc) {
echo "用户无权限访问: https://m66.net$url ($desc)" . PHP_EOL;
}
输出:
用户无权限访问: https://m66.net/admin/users (管理用户)
用户无权限访问: https://m66.net/admin/settings (系统设置)
array_diff_ukey() 是一个被很多开发者忽略的强大函数,尤其在权限过滤场景中,它通过比较数组的键名,可以高效实现差异筛选。它相比手动遍历判断权限,代码更简洁、可读性更强。建议在处理权限逻辑时,优先考虑使用该函数优化性能和结构。