PHP:如何检查用户是否可以递归访问某个组?

时间:2016-04-12 16:20:31

标签: php arrays recursion multidimensional-array

我正在尝试为我的用户创建一个简单的访问检查。基本上我有一组像trialpaidadmin这样定义的组,如下所示:

$levels = ['trial' => [], 'enterprise' => ['admin'], 'paid' => ['trial'], 
 'admin' => ['paid', 'editor'], 'editor' => []];

查看paid群组。 paid群组中有trial个群组,这意味着paid群组用户也可以访问trial群组。

同样,admin群组可以访问paideditor trial群组,因为adminpaid群组在它的数组中,paid组的数组中有trial组(我猜需要递归)。

我的功能是这样的(但我无法弄清楚递归部分):

<?php
public function hasAccess($requiredLevel, $myLevel) {    
    global $levels;
    return (($myLevel == $requiredLevel) || (in_array($requiredLevel, $levels[$myLevel]));  
}

当水平直接出现在数组中但未能建立关联时,这是有效的,例如当级别连接时admin => paid => trial

如何修改此功能,以便以最简单的方式递归检查?

P.S。它们的存储顺序也不固定。

1 个答案:

答案 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>