我正在尝试为我的用户创建一个简单的访问检查。基本上我有一组像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
如何修改此功能,以便以最简单的方式递归检查?
P.S。它们的存储顺序也不固定。
答案 0 :(得分:1)
这应该这样做:
$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;
}
作为参数传递而不是使用全局变量,因为它允许更多的灵活性,而全局变量通常是一种不好的做法。
你唯一需要注意的是循环引用,你最终会得到一个无限循环。要解决此问题,只需将已访问级别的数组作为可选参数传递:
<!DOCTYPE html>
<html>
<head>
<title>Money System</title>
<script>
var gold = 0;
var goldpersecond = 0;
var lvl = 0;
//end of variables list
function lvlup(){
lvl = lvl + 1;
document.getElementById("lvl").value = lvl;
goldpersecond = lvl - 1;
if (goldpersecond >= 1){
window.setInterval(
function () {
gold = gold + goldpersecond;
document.getElementById("gold").innerHTML = "You have " + gold + " gold!";
}, 1000);
}
}
</script>
</head>
<body>
<input type="text" value="Level" disabled name="test">
<input type="text" value ="0" id="lvl"/>
<br>
<input type="text" value="Gold" disabled name="test"/>
<input type="text" value="0" id="Gold"/>
<br>
<button type="button" onClick= "lvlup()">Level Up!</button>
</body>