2016-04-28 16 views
2

Ich habe den Code unten geschrieben und es funktioniert gut, aber ich habe das Gefühl, dass es besser gemacht werden kann. Sobald ich 10 Rollen und 10 verschiedene Zustände (neu, geprüft usw.) habe, wird das Array sehr groß.Schreiben eines sauberen mehrdimensionalen Arrays

Hat jemand eine Lösung, die dieselbe Lösung zum Übergeben des Status und der Rolle hat und den Sperr- und Entsperrstatus zurückgibt?

public function lockingPermissions($state, $role) 
{ 
    $lockingPermissions = [ 
     'technician' => [ 
      'new' => [ 
       'lock' => true, 
       'unlock' => false 
      ], 
      'checked' => [ 
       'lock' => true, 
       'unlock' => false 
      ] 
     ], 
       ..... 
    ]; 

    return $lockingPermissions[$role][$state]; 
} 

Antwort

1

Das multidimensionale Array wird dynamisch gefüllt.

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")); 

UPDATE Mehr dynamisch:

<?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")); 
+0

Passt dies zu unterschiedlichen Sperroptionen für jede Rolle und jeden Status? Tolle Idee, das habe ich versucht herauszufinden. Ich brauche nur verschiedene Lock- und Unlock-Optionen für jeden Status und jede Rolle. – Jonathan

1

Zunächst einmal muss man davon ausgehen, dass ein leerer Wert bedeutet keine Genehmigung. Auf diese Weise können Sie alle Rollendefinitionen ohne Berechtigung überspringen. Dann können Sie Flags verwenden. Zunächst definieren die Fahnen:

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 

I Konstante verwenden, wie PHP-Standard, aber Sie können Variablen (oder direkt den ganzen Zahlen) verwenden. Regel für Flag sind, dass sie eindeutige ganze Zahlen und Potenzen von 2 sein müssen (1, 2, 4, 8, 16, 32, ...). Sie können Gruppierungsflags auch mit | Bitwise-Operator erstellen: d. H., Full-Privilegien für "neu" kann 3 (= 1 | 2) sein.

Dann können Sie das Array auf diese Weise erstellen:

$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 
]; 

An dieser Stelle können Sie eine hypothetische Funktion auf diese Weise nennen:

$perm = $lockingPermissions[$role]; 

und Berechtigungen überprüfen auf diese Weise:

if($perm & LP_NEW_LOCK) ... 

Wenn Sie Variablen verwenden möchten, müssen Sie in der Funktion als global deklarieren. In diesem Fall empfehle ich Ihnen, ein Array zu verwenden, um den Code zu vereinfachen.

Verwandte Themen