[英]PHP: How to check if user can access a certain group recursively?
我正在尝试为我的用户创建一个简单的访问检查。 基本上,我有一个像trial
, paid
, admin
等定义的数组,如下所示:
$levels = ['trial' => [], 'enterprise' => ['admin'], 'paid' => ['trial'],
'admin' => ['paid', 'editor'], 'editor' => []];
看一下paid
组。 paid
组的数组中包含trial
组,这意味着paid
组用户也可以访问trial
组。
同样, admin
组可以访问paid
, editor
和 trial
组,因为admin
在其阵列中具有paid
组,而paid
组在其阵列中具有trial
组(我想需要递归)。
我的函数是这样的(但是我无法弄清楚递归部分 ):
<?php
public function hasAccess($requiredLevel, $myLevel) {
global $levels;
return (($myLevel == $requiredLevel) || (in_array($requiredLevel, $levels[$myLevel]));
}
当级别直接存在于数组中但无法建立关联时,例如,当级别连接起来,例如admin => paid => trial
如何修改此功能,以便它可以以最简单的方式递归检查?
PS它们的存储顺序也不固定。
应该这样做:
public function hasAccess($requiredLevel, $levels, $myLevel) {
// Check if $myLevel matches $requiredLevel
if ($requiredLevel === $myLevel) {
return true;
}
// Iterate through all levels under $myLevel
foreach ($levels[$myLevel] as $level) {
// If any of those levels has access, return true
if ($this->hasAccess($requiredLevel, $levels, $level)) {
return true;
}
}
return false;
}
我希望这些评论足以为您解决。
我还建议您传入$levels
作为参数,而不要使用全局变量,因为它可以提供更大的灵活性,并且全局变量通常是一种不好的做法。
您唯一需要注意的是循环引用,在循环引用中最终会出现无限循环。 为了解决这个问题,只需将已经访问过的级别数组作为可选参数传递:
public function hasAccess($requiredLevel, $levels, $myLevel, $visited = []) {
// Check if $myLevel matches $requiredLevel
if ($requiredLevel === $myLevel) {
return true;
}
// Add the current level to the visited array
$visited[] = $myLevel;
// Iterate through all levels under $myLevel
foreach ($levels[$myLevel] as $level) {
// Return true if any of those levels has access,
// and hasn't been visited before
if (
!in_array($level, $visited) &&
$this->hasAccess($requiredLevel, $levels, $level, $visited)
) {
return true;
}
}
return false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.