我已经编写了下面的代码并且效果很好,但我觉得可以做得更好。一旦我有10个角色和10个不同的状态(新的,检查等),那么数组将变得非常大。
有没有人有一个解决方案,它有关于传入状态和角色的相同解决方案,并返回锁定和解锁状态?
foo.h : version
答案 0 :(得分:1)
动态填充多维数组。
function lockingPermissions($state, $role)
{
$lockingPermissions = array();
$roles = array('technician','executive','programmer','other');
$states = array('new','checked','old','other');
$options = array('lock' => true, 'unlock' => false);
$newStates = array();
foreach($states as $value){
$newStates[$value] = $options;
}
foreach($roles as $role){
$lockingPermissions[$role] = $newStates;
}
//var_dump($lockingPermissions);
//Check the value
if(array_key_exists($role,$lockingPermissions)){
if(array_key_exists($state,$lockingPermissions[$role])){
return $lockingPermissions[$role][$state];
}else{
return false;
}
}else{
return false;
}
}
var_dump(lockingPermissions("new","technician"));
var_dump(lockingPermissions("checked","executive"));
更新,更动态:
<?php
function lockingPermissions($state, $role)
{
$lockingPermissions = array();
$roles = array('technician','executive','programmer','other');
$states = array('new' => 'options_type_1','checked'=> 'options_type_1','old'=> 'options_type_2','other'=> 'options_type_2');
$options = array(
'options_type_1' => array('lock' => true, 'unlock' => false),
'options_type_2' => array('lock' => true, 'unlock' => false, 'other' => true)
);
$newStates = array();
foreach($states as $key => $value){
//$newStates[$value] = $options;
$newStates[$key] = $options[$value];
}
foreach($roles as $role){
$lockingPermissions[$role] = $newStates;
}
var_dump($lockingPermissions);
//Check the value
if(array_key_exists($role,$lockingPermissions)){
if(array_key_exists($state,$lockingPermissions[$role])){
return $lockingPermissions[$role][$state];
}else{
return false;
}
}else{
return false;
}
}
var_dump(lockingPermissions("new","technician"));
var_dump(lockingPermissions("checked","executive"));
//var_dump(lockingPermissions("new","technicianx"));
答案 1 :(得分:1)
首先,您必须假设空值表示没有权限。通过这种方式,您可以在未经许可的情况下省略所有角色定义。然后,您可以使用标志。首先,定义标志:
define( 'LP_NEW_LOCK', 1 ); # 2**0
define( 'LP_NEW_UNLOCK', 2 ); # 2**1
define( 'LP_CHECKED_LOCK', 4 ); # 2**2
define( 'LP_CHECKED_UNLOCK', 8 ); # 2**3
(...)
define( 'LP_LOCK_ALL', 349525 ); # 2**0|2**2|2**4|2**6|2**8|2**10|2**12|2**14|2**16|2**18
define( 'LP_UNLOCK_ALL', 699050 ); # 2**1|2**3|2**5|2**7|2**9|2**11|2**13|2**15|2**17|2**19
define( 'LP_ALL', 1048575 ); # 2**20-2**0
我使用常量,就像PHP标准一样,但你可以使用变量 1 (或直接使用整数)。标志规则是它们必须是唯一的整数和2的幂(1,2,4,8,16,32,...)。您还可以使用|
按位运算符创建分组标志:即,“new”的完整权限可以是3(= 1 | 2)。
然后,您可以用这种方式创建数组:
$lockingPermissions = [
'admin' => LP_ALL,
'technician' => LP_LOCK_ALL,
'role3' => LP_NEW_LOCK | LP_NEW_UNLOCK | LP_CHECKED_LOCK,
'role4' => LP_LOCK_ALL ^ LP_NEW_LOCK, # lock all except new
'role5' => 0 # No permissions
];
此时,您可以通过以下方式调用假设函数:
$perm = $lockingPermissions[$role];
以这种方式检查权限:
if( $perm & LP_NEW_LOCK ) ...
1 如果要使用变量,则必须在函数内声明为全局变量。在这种情况下,我建议您使用数组来简化代码。