Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Datensätze als Baum darstellen (https://www.delphipraxis.net/108794-%5Bphp%5D-datensaetze-als-baum-darstellen.html)

Matze 20. Feb 2008 14:10

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:
Array
(
    [1] => Array
        (
            [text] => Test1
            [data] => Data1
            [childs] => Array
                (
                    [3] => Array
                        (
                            [text] => Test3
                            [data] => Data3
                            [childs] => Array
                                (
                                    [9] => Array
                                        (
                                            [text] => Test9
                                            [data] => Data9
                                        )

                                )

                        )

                )

        )

)
Es fehlt also die Hälfte. :gruebel:
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

cruiser 20. Feb 2008 14:33

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>

Matze 20. Feb 2008 14:34

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

cruiser 20. Feb 2008 14:46

Re: [PHP] Datensätze als Baum darstellen
 
nur mal testweise:

kommentier mal Zeile 47 aus ( unset($ds[$key]); )

Matze 20. Feb 2008 14:47

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.

cruiser 20. Feb 2008 14:48

Re: [PHP] Datensätze als Baum darstellen
 
hum... dann versteh ichs nich :drunken:

inherited 20. Feb 2008 14:55

Re: [PHP] Datensätze als Baum darstellen
 
Bei mir funktioniert es auch mit php4 nicht.

cruiser 20. Feb 2008 14:58

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

Matze 20. Feb 2008 15:01

Re: [PHP] Datensätze als Baum darstellen
 
Zitat:

Zitat von cruiser
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

Perfekt, vielen Dank! :firejump:

Da eine Referenz ist auch nicht nötig, richtig. Es geht nun. :thumb:

cruiser 20. Feb 2008 15:21

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 01:52 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz