2016-03-31 12 views
-1

Ich habe ein Baum-Array, aber ich möchte das Array nach Dimension gruppieren, so dass ich jede Ebene des Baumes in seinem eigenen DIV anzeigen kann.Wie gruppiere Array nach Dimensionsebene?

Mein Baum Array ist:

$tree = 
array(
    1 => array('id'=>1, 'title'=>'Category 1', 'parent_id'=>0, 
     'children'=> array(
      2 => array('id'=>2, 'title'=>'Category 2', 'parent_id'=>1, 'children'=>''), 
      3 => array('id'=>3,'title'=>'Category 3','parent_id'=>1,'children'=>''), 
      4 => array('id'=>4, 'title'=>'Category 4', 'parent_id'=>1, 
       'children'=> array(
        8 => array('id'=>8, 'title'=>'Category 8', 'parent_id'=>4, 'children'=>''), 
        9 => array('id'=>9, 'title'=>'Category 9', 'parent_id'=>4, 'children'=>''), 
        10 => array('id'=>10, 'title'=>'Category 10', 'parent_id'=>4, 
         'children'=> array(
          11 => array('id'=>11, 'title'=>'Category 11', 'parent_id'=>10, 'children'=>''), 
          12 => array('id'=>12, 'title'=>'Category 12', 'parent_id'=>10, 'children'=>''), 
          13 => array('id'=>13, 'title'=>'Category 13', 'parent_id'=>10, 'children'=>'') 
         ) 
        ) 
       ) 
      ) 
     ) 
    ), 
    5 => array('id'=>5, 'title'=>'Category 5', 'parent_id'=>0, 
     'children'=>array(
      6 => array('id'=>6,'title'=>'Category 6', 'parent_id'=>5, 'children'=>''), 
      7 => array('id'=>3,'title'=>'Category 7', 'parent_id'=>5, 'children'=>'') 
     ) 
    ) 
); 

ich auf jeder Ebene wie this trennen möchten. Meine Idee für die gruppierte Ausgabe ist so etwas wie folgt aus:

$grouped = array(
    0 => array(
     1 => array('id'=>1, 'title'=>'Category 1', 'parent_id'=>0), 
     5 => array('id'=>5, 'title'=>'Category 5', 'parent_id'=>0) 
    ), 
    1 => array(
     2 => array('id'=>2, 'title'=>'Category 2', 'parent_id'=>1), 
     3 => array('id'=>3, 'title'=>'Category 3', 'parent_id'=>1), 
     4 => array('id'=>4, 'title'=>'Category 4', 'parent_id'=>1), 
     6 => array('id'=>6, 'title'=>'Category 6', 'parent_id'=>5), 
     7 => array('id'=>3, 'title'=>'Category 7', 'parent_id'=>5) 
    ), 
    2 => array(
     8 => array('id'=>8, 'title'=>'Category 8', 'parent_id'=>4), 
     9 => array('id'=>9, 'title'=>'Category 9', 'parent_id'=>4), 
     10 => array('id'=>10, 'title'=>'Category 10', 'parent_id'=>4) 
    ), 
    3 => array(
     11 => array('id'=>11, 'title'=>'Category 11', 'parent_id'=>10), 
     12 => array('id'=>12, 'title'=>'Category 12', 'parent_id'=>10), 
     13 => array('id'=>13, 'title'=>'Category 13', 'parent_id'=>10) 
    ) 
); 

Etwas anderes ist in Ordnung, wenn Sie andere Ideen haben, aber ich möchte foreach das Ausgabe-Array der Lage sein, und in einem anderen, alle Elemente eines jeden Levels angezeigt werden DIV.

EX:

<div id="box-1"> 
    Group Array[1] 
</div> 
<div id="box-2"> 
    Group Array[2] 
</div> 
<div id="box-3"> 
    Group Array[3] 
</div> 
<div id="box-4"> 
    Group Array[4] 
</div> 

Wie kann ich das tun?

+2

Siehe bitte [fragen] und [Die perfekte Frage] (http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/). – Rizier123

+0

Sie können dies rekursiv implementieren. Schreiben Sie eine Funktion, die alle Informationen der aktuellen Ebene zu einer Liste hinzufügt, und rufen Sie dann (innerhalb dieser Funktion) die Funktion selbst für die Eigenschaft "children" auf. – jojonas

+0

Ich habe Ihre Frage bearbeitet, um den Code aus den Bildern hinzuzufügen und zu verdeutlichen, was ich als Ihr beabsichtigtes Ziel empfand. Bitte zögern Sie nicht, die Änderungen erneut zu bearbeiten oder rückgängig zu machen, wenn dies nicht Ihren Vorstellungen entspricht. Wenn Sie Code hinzufügen können, mit dem Sie dies versucht haben, kann dies helfen, die Frage weiter zu klären. –

Antwort

2

Hier ist ein Beispiel für eine einfache rekursive Funktion, die jede Ebene eines Baumarrays trennt.

// begin with a reference to an empty array and level 0 
function split_levels($branches, &$output = array(), $level = 0) { 

    // loop over each element of the current branch 
    foreach ($branches as $id => $branch) { 

     // if the element has children, make a recursive call with an incremented level 
     if ($branch['children']) split_levels($branch['children'], $output, $level + 1); 

     // remove the children (this is optional) 
     unset($branch['children']); 

     // add the element to the output array at the appropriate level 
     $output[$level][$id] = $branch; 
    } 
} 

Da $output ist eine Referenz in dieser Funktion sollte es wie folgt aufgerufen werden:

split_levels($tree, $output); 

und die Ergebnisse in $output sein wird.

+0

Es funktioniert !!!! Danke sehr Brei. :) – user3514448

Verwandte Themen