PHP + CodeIgniter foreach循环显示每个列表项,而只有在用户有权查看此选项时才显示列表标题

时间:2014-02-28 08:19:32

标签: php arrays codeigniter permissions

我正在使用codeigniter,我有一种情况,我有一个用户对My_Controller.php中变量中定义的特定链接的特定权限数组。我还有一个在配置文件(application / config)中指定的多维链接数组。现在需要的是循环权限,将它们与链接数组进行比较,并打印出用户有权访问的链接,同时根据配置文件中定义的标题对链接进行分组。我设法循环,但问题是它在每个选项后显示标题,而不是打印标题一次下面的链接列表。我检查了一个类似的问题,发现解决方法是相同的,但问题出现在我必须遍历权限数组,这意味着我有三个嵌套循环而不是两个。还有三个嵌套循环的性能权衡吗?

这是预期的输出;

管理

Users
Edit Users
Reception

工具

Settings
Edit Settings

这就是我得到的;

管理

Users

管理

Edit Users

管理

Reception

工具

Settings

工具

Edit Settings

这是配置文件:

$config['nav']['manage'] = array(
    'users' => 'auth_title_users',
    'users/edit' => 'auth_title_users_edit',
    'reception' => 'auth_title_reception'
);

$config['nav']['tools'] = array(
    'settings' => 'auth_title_settings',
    'settings/edit' => 'auth_title_settings_edit'
);

这是我的header.php中的代码(application / views / includes);

// $navs contains the multidimentional array of the defined links according to the config file
$navs = $this->config->item('nav', 'tank_auth');

// $menu_items is the array containing permissions the user has from the db
foreach($menu_items as $menu_item){ 
    $val = $menu_item;

    if($navs){
    foreach($navs as $k => $v){
        if(is_array($v)){
            $header_written = FALSE;
            foreach($v as $key => $value){
                // compare permissions against the links
                if($val == $key){   
                    if (!$header_written){
                        $section_hr = lang('auth_section_'.$k);
                        echo "\t<h3>".$section_hr."</h3>\n";
                    }
                    $list_item = lang('auth_title_'.$key);
                    echo "\t<ul>\n";
                    echo "\t\t<li>".$list_item."</li>\n";
                    $header_written = TRUE;
                }           
            } 
        }
        else{
            $header_written = FALSE;
        }       
        if ($header_written){
            echo "\t</ul>\n";
        }    
    }
}
}

1 个答案:

答案 0 :(得分:0)

使用in_array而不是循环用户拥有的权限,这将允许您删除最外部的foreach语句。

if ( in_array($key, $menu_items) ) # instead of if($val == $key){