2015-12-29 9 views
5

Ich habe ein multidimensionales PHP-Array, das ich verwende, um einen hierarchischen UL-Baum zu generieren. Vor dem Anzeigen des UL-Baums möchte ich jedoch jede Ebene innerhalb des Arrays alphabetisch nach dem Attribut 'name' sortieren. Ich stelle mir eine Funktion vor, die jede Ebene rekursiv überprüft, alphabetisch sortiert und zur nächsten Ebene weitergeht, um diese Ebene zu sortieren. Aber ich bin mir nicht sicher, wie ich das machen soll. Jede Hilfe wäre willkommen!Sortieren jeder Ebene eines geschachtelten multidimensionalen PHP-Arrays

Mein Array:

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

Mein Versuch, die die Reihenfolge um sich bewegt, aber es ist noch nicht alphabetisch. Beachten Sie, dass die Array ($ this, 'sortByName') wird von CodeIgniter erforderlich, die ich in arbeite:

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: SOLUTION

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

und Ihr Versuch ist? –

+0

Überprüfen Sie dies, wenn es hilft: http://StackOverflow.com/a/3805256/5645769 –

+0

@TareqMahmood Vielen Dank für die Referenz. Die für diesen Post aufgelisteten Lösungen scheinen jedoch nur für die erste Ebene innerhalb des mehrdimensionalen Arrays zu gelten. Sie adressieren nicht meine Situation, wo ich Arrays verschachtelt habe. – skiindude22

Antwort

2

ich eine algorithmische abgetippt Denkweise, so dass Sie den Code selbst implementieren können. Außerdem möchte ich dir nicht den ganzen Spaß wegnehmen! :-)

Wenn es nicht genug für Sie ist, überprüfen Sie 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

Verwenden Sie die Erfahrung mit Bedacht ... –

+0

@BasheerAhmed was meinst du überhaupt damit? Du bist eine verwirrende Person. –

+0

Oh mein Gott und auch ich habe das nicht bemerkt .. :) –

Verwandte Themen