在開發後台管理系統或者權限管理模塊時,權限控制通常是不可或缺的一部分。一個典型的場景是,系統中存在一套完整的權限列表,而每個用戶只被授予其中的一部分權限。為了在展示界面或執行功能前有效地過濾掉用戶沒有的權限,我們需要一種既準確又高效的方法進行權限篩選。 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()是一個被很多開發者忽略的強大函數,尤其在權限過濾場景中,它通過比較數組的鍵名,可以高效實現差異篩選。它相比手動遍歷判斷權限,代碼更簡潔、可讀性更強。建議在處理權限邏輯時,優先考慮使用該函數優化性能和結構。