编写一个干净的多维数组

时间:2016-04-28 22:56:14

标签: php arrays multidimensional-array

我已经编写了下面的代码并且效果很好,但我觉得可以做得更好。一旦我有10个角色和10个不同的状态(新的,检查等),那么数组将变得非常大。

有没有人有一个解决方案,它有关于传入状态和角色的相同解决方案,并返回锁定和解锁状态?

foo.h : version

2 个答案:

答案 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 如果要使用变量,则必须在函数内声明为全局变量。在这种情况下,我建议您使用数组来简化代码。