Verschachtelung aus Array in Array

Eagle-PsyX-

Erfahrenes Mitglied
Stehe irgendwie auf dem Schlauch, vielleicht kann mir jemand Helfen.
Ich hätte gerne folgendes Array verschachtel sortiert:
Code:
Array (
    [0] => Array
        (
            [category_id] => 1
            [cat_title] => Level 1
            [level] => 0
        )

    [1] => Array
        (
            [category_id] => 2
            [cat_title] => Level 2a
            [level] => 1
        )

    [2] => Array
        (
            [category_id] => 4
            [cat_title] => Level 2a-3a
            [level] => 2
        )

    [3] => Array
        (
            [category_id] => 5
            [cat_title] => Level 2a-3b
            [level] => 2
        )

    [4] => Array
        (
            [category_id] => 3
            [cat_title] => Level 2b
            [level] => 1
        )
)
zu
Code:
Array (
    [0] => Array
        (
            [category_id] => 1
            [cat_title] => Level 1
            [level] => 0
            [children] = > Array 
                (
                    [0] => Array
                        (
                            [category_id] => 2
                            [cat_title] => Level 2a
                            [level] => 1
                            [children] => Array 
                                (
                                    [0] => Array
                                        (
                                            [category_id] => 4
                                            [cat_title] => Level 2a-3a
                                            [level] => 2
                                        )
                                        
                                    [1] => Array
                                        (
                                            [category_id] => 5
                                            [cat_title] => Level 2a-3b
                                            [level] => 2
                                        )
                                )
                        )
					[1] => Array
						(
							[category_id] => 3
							[cat_title] => Level 2b
							[level] => 1
						)
                )
        )
)
Müsste ja eigentlich nichtmal zu schwer sein -.- bin kaputt...
Da sollte ein foreach() mit etwas Logik ausreichen.
 
Zuletzt bearbeitet:
Da fehlt irgendwie die Information wie die parent-id. Woher weiss man, dass level 2a-3a unter Level 2a ist und nicht unter level 2b?

Wenn du die Infos dazu in einer MySQL DB gespeichert hast, hätt ich dir grad ein Beispiel wie du es im SQL lösen kannst
MySQL Hierarchie Baum auslesen
 
Es gibt keine parent_id in dem Fall. Es handelt sich um das Nested Sets-Model:

PHP:
$navigation['category']['query_string'] = "
    SELECT o.category_id, o.category_name_de AS cat_title, o.category_left, o.category_right,
         COUNT(p.category_id)-1 AS level,
         (SELECT COUNT(*) FROM `".$DataBase['content']."` AS text WHERE text.text_category = o.category_id) AS count_content,
         (SELECT COUNT(*) FROM `".$DataBase['gallery']."` AS gal WHERE gal.gal_category = o.category_id) AS count_gallery,
         (SELECT COUNT(*) FROM `".$DataBase['product']."` AS prod WHERE prod.product_category = o.category_id) AS count_product
    FROM `".$DataBase['category']."` AS n,
         `".$DataBase['category']."` AS p,
         `".$DataBase['category']."` AS o
    WHERE 
        o.category_left 
            BETWEEN p.category_left AND 
            p.category_right
        AND o.category_left 
            BETWEEN 
n.category_left AND 
n.category_right
        AND n.category_id = ".$nav['cat_id']."
    GROUP BY 
        o.category_left
    ORDER BY 
        o.category_left";
$navigation['category']['query'] = mysql_query($navigation['category']['query_string']);

if($navigation['category']['query']) {
   $collect = array();
   while($row = mysql_fetch_assoc($navigation['category']['query'])) {
    $collect[] = $row;
  }
}
Oben wird lediglich print_r($collect) angezeigt.
Dabei wurde vorhin o.category_left und o.category_right weggelassen.
 
Gut, wie ich das sehe, hast du die Nodes also bereits in der richtigen Reihenfolge und man kann also auf den vorhergehenden Node ausfbauen um den Tree zu erstellen.

Eine Möglickeit
PHP:
//$flat = der flache Array
//Parents definieren und ein Level-Array aufbauen
$lastIndex[0]=NULL;
foreach($flat as $index => &$node){
    $node['parent'] = $lastIndex[$node['level']];
    $lastIndex[$node['level']+1] = $index;
    
    $levels[$node['level']][$index] = $node;
}
//Nach level sortieren, damit die tiefsten Levels zuerst kommen 
arsort($levels);

//Alle Levels durchgehen und die Nodes jeweils an den nächst höheren Level anhängen
foreach($levels as $level => &$nodes){
    foreach($nodes as $index => &$node){
        if(!is_null($node['parent'])){
            $levels[$node['level']-1][$node['parent']]['childrens'][] = $node;
        }
    }
}
//Am Ende interessiert uns das Resultat des Level 0, denn dies beinhaltet den ganezn tree
$tree = $levels[0];
print_r($tree);
 
Zurück