2010-06-26 11 views
2

J'ai un tableau des autorisations:Comment trier un tableau multidimensionnel en fonction de ses éléments et de ses valeurs?

array(
    array("controller" => "somewhere", "action" => "",  "namespace" => "admin", "method" => "GET"), 
    array("controller" => "somewhere", "action" => "index", "namespace" => "admin", "method" => ""), 
    array("controller" => "somewhere", "action" => "index", "namespace" => "admin", "method" => "GET") 
) 

que je dois trier, de sorte que plus une « spécifique » apparaît en premier. La météo ou non spécifique est déterminée par sa pertinence par rapport au contrôleur, à l'action et à l'espace de noms actuellement chargés.

Tout d'abord: couvrir les contrôleurs des trois tableaux de la même zone, mais leurs actions ne fonctionne pas. Donc, ceux avec une action spécifique devraient être triés au-dessus de ceux sans.

Deuxièmement:: Ils partagent le même espace de noms, mais pas la même méthode. Donc ceux avec une méthode spécifique devraient être triés au-dessus de ceux sans.

Si vous avez des idées, ou avez des questions qui ont besoin d'explications, s'il vous plaît demandez-moi. J'apprécierais vraiment de pouvoir trier ce tableau, donc je n'ai pas besoin de refaire mon architecture pour les permissions.

// Emil

+0

double possible de [tableaux de tri en tableau multidimensionnel par clé] (http: //stackoverflow.com/questions/904718/sort-arrays-into-multidimensional-array-by-key) et [Comment trier un tableau multidimensionnel en php] (http://stackoverflow.com/questions/96759/how -do-i-tri-multidimensionnel-array-in-php) et [tableau tri PHP multidimensionnel par valeur] (http://stackoverflow.com/questions/2699086/php-sort-multidimensional-array-by-value) et [une myriade d'autres] (http://stackoverflow.com/search?q=sort+multidimensional+array+php) – Gordon

Répondre

0

d'abord définir ces deux fonctions:

function specific_sort($a, $b) { 
    $r = more_specific($a, $b, 'controller'); 
    if ($r == 0) { 
     $r = more_specific($a, $b, 'action'); 
     if ($r == 0) { 
      $r = more_specific($a, $b, 'method'); 
     } 
    } 
    return $r; 
} 

function more_specific($a, $b, $key) { 
    if (empty($a[$key])) { 
     return 1; 
    } 
    if (empty($b[$key])) { 
     return -1; 
    } 
    return 0; 
} 

Puis:

$rt = array(
    array("controller" => "somewhere", "action" => "",  "namespace" => "admin", "method" => "GET"), 
    array("controller" => "somewhere", "action" => "index", "namespace" => "admin", "method" => ""), 
    array("controller" => "somewhere", "action" => "index", "namespace" => "admin", "method" => "GET") 
); 
usort($rt, 'specific_sort'); 
print '<pre>'; 
print_r($rt); 
print '</pre>'; 

Il doit imprimer:

Array 
(
    [0] => Array 
     (
      [controller] => somewhere 
      [action] => index 
      [namespace] => admin 
      [method] => GET 
     ) 

    [1] => Array 
     (
      [controller] => somewhere 
      [action] => index 
      [namespace] => admin 
      [method] => 
     ) 

    [2] => Array 
     (
      [controller] => somewhere 
      [action] => 
      [namespace] => admin 
      [method] => GET 
     ) 

) 
+0

Merci. Je suis arrivé à la même conclusion, mais où l'espoir pour quelque chose qui était déjà construit dans le noyau php (ou un plugin). – Ekampp

Questions connexes