2015-12-29 22 views
5

Ho un array PHP multidimensionale che sto usando per generare un albero UL gerarchico. Tuttavia, prima di visualizzare la struttura UL, vorrei ordinare ogni livello all'interno della matrice alfabeticamente con l'attributo 'nome'. Sto immaginando una funzione che controlla in modo ricorsivo ogni livello, organizza in ordine alfabetico e passa al livello successivo per ordinare quel livello. Ma non sono sicuro di come farlo. Qualsiasi aiuto sarebbe apprezzato!Ordinamento di ogni livello di un array PHP multidimensionale nidificato

La mia matrice:

Array ( 
[0] => Array ( 
    [id] => 39348 
    [parent] => 0 
    [name] => Test 
    [children] => Array ( 
    [0] => Array ( 
     [id] => 41911 
     [parent] => 39348 
     [name] => Test2 
     [children] => Array ( 
     [0] => Array ( 
      [id] => 40929 
      [parent] => 41911 
      [name] => Test3 
      [children] => Array ( 
       [0] => Array (
        [id] => 40779 
        [parent] => 40929 
        [name] => C 
       ) 
       [1] => Array (
        [id] => 40780 
        [parent] => 40929 
        [name] => A 
       ) 
      ) 
     ) 
    ) 
    ) 

Il mio tentativo, che si sta muovendo l'ordine in giro, ma non è ancora alfabetico. Si noti, il array ($ this, 'sortByName') è richiesto dal CodeIgniter, che sto lavorando in:

function recursive_sort($array) { 
    usort($array, array($this,'sortByName')); 
    foreach($array as $key => $value) { 
    if(isset($value['children']) && !empty($value['children']) && is_array($value['children'])) { 
     $array[$key]['children'] = $this->recursive_sort($value['children']); 
    } 
    } 
    return $array; 
} 

function sortByName($a, $b){ 
    return $a->name - $b->name; 
} 

UPDATE: SOLUZIONE

function recursive_sort($array,$child='children') { 
     usort($array,function($a,$b){ 
      return strcasecmp($a['name'], $b['name']); 
     }); 
     foreach($array as $key => $value) { 
      if(isset($value[$child]) && !empty($value[$child]) && is_array($value[$child])) { 
       $array[$key][$child] = $this->recursive_sort($value[$child],$child); 
      } 
     } 
     return $array; 
    } 
+3

e il tuo tentativo è? –

+0

Verifica se è utile: http://stackoverflow.com/a/3805256/5645769 –

+0

@TareqMahmood Grazie per il riferimento. Tuttavia, le soluzioni elencate per quel post sembrano solo applicabili al primo livello all'interno dell'array multidimensionale. Non affrontano la mia situazione in cui ho array annidati. – skiindude22

risposta

2

ho digitato un un algoritmico modo di pensare in modo da poter implementare il codice da soli. Inoltre, non vorrei portare via tutto il divertimento lontano da te! :-)

Se non è abbastanza per te, controlla this.

function example(element) { 
    if (no children exist) return 
    if (only one element exist on this level) 
     // if this code is reached, this element has children 
     example(children element) 
     return 
    names = { array of all name attributes of all elements on this level } 
    sort(names) 
    [0] => names[0] 
    [1] => names[1] 
     .. and so on for however many elements there are 
    return 
+0

usa l'esperienza con saggezza ... –

+0

@BasheerAhmed cosa vuoi dire con questo? Sei una persona confusa. –

+0

Oh mio Dio e anche io non me ne sono reso conto .. :) –

Problemi correlati