![]() |
Re: [PHP] Datensätze als Baum darstellen
Hallo Ronny,
erst einmal vielen Dank, dass du dir diese Mühe gemacht hast und das auch noch so spät (bzw. so früh *g*). :thumb: Ich erhalte als Array jedoch ein anderes, auch wenn ich deinen Code 1:1 in ein Testskript kopiere. Und zwar:
Code:
Es fehlt also die Hälfte. :gruebel:
Array
( [1] => Array ( [text] => Test1 [data] => Data1 [childs] => Array ( [3] => Array ( [text] => Test3 [data] => Data3 [childs] => Array ( [9] => Array ( [text] => Test9 [data] => Data9 ) ) ) ) ) ) Die Rekursion arbeitet sich in die tiefste Ebene des ersten Parents vor und bricht dann ab, zumindest schaut's so aus. Das würde heißen, die foreach-Schleife läuft nie zu Ende, hm. Grüße |
Re: [PHP] Datensätze als Baum darstellen
hm.... keine Ahnung... bei mir gehts... evtl. ja ne Kleinigkeiut irgendwo... hier der aktuelle Code:
Code:
<html>
<head> <title>DataSet 2 Tree - Test</title> <style> .code { margin-bottom: 10px; margin-top: 0; border: 1px solid black; } </style> </head> <body><?php // Test-Datenmenge $dataset = array( array("id"=>1, "parent"=>0, "text"=>"Test1", "data"=>"Data1"), array("id"=>2, "parent"=>0, "text"=>"Test2", "data"=>"Data2"), array("id"=>3, "parent"=>1, "text"=>"Test3", "data"=>"Data3"), array("id"=>4, "parent"=>2, "text"=>"Test4", "data"=>"Data4"), array("id"=>5, "parent"=>1, "text"=>"Test5", "data"=>"Data5"), array("id"=>6, "parent"=>1, "text"=>"Test6", "data"=>"Data6"), array("id"=>7, "parent"=>4, "text"=>"Test7", "data"=>"Data7"), array("id"=>8, "parent"=>4, "text"=>"Test8", "data"=>"Data8"), array("id"=>9, "parent"=>3, "text"=>"Test9", "data"=>"Data9") ); // rekursives füllen eines Trees aus einer Datenmenge // die & vor den variablen sind Zeigerangaben, damit auch // rauskommt was gewünscht wird function filltree(&$node, &$ds, $id=0) { // Datenmenge durchgehen (Tree-Root ist 0) foreach ($ds as $key=>$data) { // Wenn der parent mit der ID der zu füllenden Node übereinstimmt // eine Subnode erstellen if ($data["parent"] == $id) { // Zuordnung von Nutzdaten zu ID $node[$data["id"]] = array("text" => $data["text"], "data" => $data["data"]); // rekursiv füllen filltree($node[$data["id"]]["childs"], $ds, $data["id"]); // wenn es doch keine Kinder gab, den "childs"-Unterpunkt // wieder entfernen if (count($node[$data["id"]]["childs"]) == 0) { unset($node[$data["id"]]["childs"]); } // eingetragenes Node aus der Datenmenge entfernen unset($ds[$key]); } } } // das eigentliche befüllen $tree wird dabei gleich mit definiert filltree($tree, $dataset); // Debug Ausgabe echo "[b]print_r(\$tree):[/b]<pre class='code'>".print_r($tree, true)."</pre>"; ?></body> </html> |
Re: [PHP] Datensätze als Baum darstellen
Da ist es das gleiche. :?
Komisch, dass es bei dir geht und an der PHP-Version kann sowas eigentlich auch nicht liegen (PHP 5.x). |
Re: [PHP] Datensätze als Baum darstellen
nur mal testweise:
kommentier mal Zeile 47 aus ( unset($ds[$key]); ) |
Re: [PHP] Datensätze als Baum darstellen
Das habe ich bereits alles versucht, dennoch danke. Es sieht wirklich so aus, als würde die Schleife nicht zu Ende laufen.
|
Re: [PHP] Datensätze als Baum darstellen
hum... dann versteh ichs nich :drunken:
|
Re: [PHP] Datensätze als Baum darstellen
Bei mir funktioniert es auch mit php4 nicht.
|
Re: [PHP] Datensätze als Baum darstellen
Nimm mal das Reference-Zeichen bei &$ds (Zeile 32) weg so dass da nur noch $ds steht... foreach scheint bei references seltsam zu funzen laut help... sorry
|
Re: [PHP] Datensätze als Baum darstellen
Zitat:
Da eine Referenz ist auch nicht nötig, richtig. Es geht nun. :thumb: |
Re: [PHP] Datensätze als Baum darstellen
Dann aber zumindest die kopierte Datenmenge redzieren und damit den Schleifendurchlauf verkürzen ;)
Code:
<html>
<head> <title>DataSet 2 Tree - Test</title> <style> .code { margin-bottom: 10px; margin-top: 0; border: 1px solid black; } </style> </head> <body><?php // Test-Datenmenge $dataset = array( array("id"=>1, "parent"=>0, "text"=>"Test1", "data"=>"Data1"), array("id"=>2, "parent"=>0, "text"=>"Test2", "data"=>"Data2"), array("id"=>3, "parent"=>1, "text"=>"Test3", "data"=>"Data3"), array("id"=>4, "parent"=>2, "text"=>"Test4", "data"=>"Data4"), array("id"=>5, "parent"=>1, "text"=>"Test5", "data"=>"Data5"), array("id"=>6, "parent"=>1, "text"=>"Test6", "data"=>"Data6"), array("id"=>7, "parent"=>4, "text"=>"Test7", "data"=>"Data7"), array("id"=>8, "parent"=>4, "text"=>"Test8", "data"=>"Data8"), array("id"=>9, "parent"=>3, "text"=>"Test9", "data"=>"Data9") ); // rekursives füllen eines Trees aus einer Datenmenge // die & vor den variablen sind Zeigerangaben, damit auch // rauskommt was gewünscht wird function filltree(&$node, $ds, $id=0) { // Datenmenge durchgehen (Tree-Root ist 0) foreach ($ds as $key=>$data) { // Wenn der parent mit der ID der zu füllenden Node übereinstimmt // eine Subnode erstellen if ($data["parent"] == $id) { // Zuordnung von Nutzdaten zu ID $node[$data["id"]] = array("text" => $data["text"], "data" => $data["data"]); // eingetragenes Node aus der Datenmenge entfernen unset($ds[$key]); // rekursiv füllen filltree($node[$data["id"]]["childs"], $ds, $data["id"]); // wenn es doch keine Kinder gab, den "childs"-Unterpunkt // wieder entfernen if (count($node[$data["id"]]["childs"]) == 0) { unset($node[$data["id"]]["childs"]); } } } } // das eigentliche befüllen $tree wird dabei gleich mit definiert filltree($tree, $dataset); // Debug Ausgabe echo "[b]print_r(\$tree):[/b]<pre class='code'>".print_r($tree, true)."</pre>"; ?></body> </html> |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz