Delphi-PRAXiS
Seite 3 von 4     123 4      

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 15:23

Re: [PHP] Datensätze als Baum darstellen
 
Ah super, danke. :)

cruiser 20. Feb 2008 15:51

Re: [PHP] Datensätze als Baum darstellen
 
Noch ne kleine Änderung um die Durchlaufzeit zu optimieren ;)

Code:
// 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
      $ds = 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"]);
      }
    }
  }

  return $ds;
}

Matze 20. Feb 2008 16:13

Re: [PHP] Datensätze als Baum darstellen
 
Öhm was habe ich davon, wenn ich $ds zurückgebe?
Das neue Array wird doch über &$node zurückgegeben, das andere interessiert mich eigentlich nicht, denn das habe ich davor ja auch schon, sonst könnte ich es nicht übergeben.

cruiser 20. Feb 2008 16:23

Re: [PHP] Datensätze als Baum darstellen
 
Aus $ds fliegen in der Rekursion weitere Datensätze, was dieses Tabellen-Array weiter kürzt und die Durchlaufzeit verringert. Die Rückgabe ist im Grunde nur für die Rekursion gut. Man könnt noch ne Prüfung auf $id != 0 vorsetzen ;)

Matze 20. Feb 2008 16:36

Re: [PHP] Datensätze als Baum darstellen
 
Achso stimmt!
Danke. irgendwann muss ich mir das mal ganz genau ansehen, denn die Rekursion macht mir doch jedesmal neu zu schaffen, auch wenn diese im Endeffekt immer ähnlich ist. :stupid:

omata 21. Feb 2008 00:49

Re: [PHP] Datensätze als Baum darstellen
 
Ich habe mich hier auch nochmal dran versucht.

Gruss
Thorsten

Matze 21. Feb 2008 07:43

Re: [PHP] Datensätze als Baum darstellen
 
Hallo Thorsten,

dankeschön. Dieses "CALL ..." habe ich noch nie verwendet, es klingt jedoch interessant, Abfragen so auslagern zu können. Die SQL-Abfrage scheint sehr komplex zu sein mit temporären Tabellen und ähnlichem. Mir persönlich kommt das ein wenig unsauber vor, doch da ich von dir bisher nur guten Source kenne, wird das schon sinnvoll sein, es so zu machen, auch wenn ich noch nicht alles nachvollziehen kann. :stupid:
Da das so viele Abfragen sind, würde ich sagen, ist das ganze recht langsam, doch das kann natürlich täuschen. Ich muss das bei Gelegenheit mal ausprobieren, falls ich das zum Laufen bekomme, auch wenn ich denke, dass ich bei der "einfacheren" Version bleibe, da ich deinen Code, selbst wenn ich ihn hundertprozentig verstehen würde, in ein paar Monaten nicht mehr nachvollzehen kann, denke ich.

Aktuell habe ich eine sehr simple "SELECT * FROM ..."-Abfrage, da ich wirklich alles aus der Tabelle benötige.

PS: Ich denke, dein verlinktes Thema wäre nicht schlecht für die Code-Library, zumindest der erste Beitrag. Den 2. könnte ich abtrennen und von der CL aus verlinken, da PHP in der CL weniger gut aufgehoben ist. :)

omata 21. Feb 2008 20:09

Re: [PHP] Datensätze als Baum darstellen
 
Über das CALL wird eine Stored Procedure auf dem Server ausgeführt. In der Prozedur wird die Baumstruktur der einen Tabelle ausgelesen und in der richtigen Reihenfolge ausgegeben.
Das interressante daran ist, das das verarbeiten der Baumstruktur sau schnell geht. Da hier bei jedem Schleifendurchlauf immer alle Elemente einer Baumebene angehängt werden. Bei einer Baumstiefe von 30 wird die Schleife auf dem Server also 30 mal ausgeführt, wieviele Baumelemente vorhanden sind ist dabei fast egal.
Du hast also nach außen nur eine SQL-Anfrage und bekommst einen, egal wie tief auch immer, verschachtelten Baum in einer super kurzen Zeit. Optimaler kannst du eine Baumstruktur nicht aus einer Datenbank ziehen.

Naja, du must das für dich entscheiden.

Gruss
Thorsten

Matze 21. Feb 2008 21:33

Re: [PHP] Datensätze als Baum darstellen
 
Hallo Thorsten,

das klingt natürlich sehr interessant. Ich werde auf jedenfall versuchen, den Code nachzuvollziehen, denn auf den ersten Blick sah dieser sehr verwirrend aus.
Ich werde das Array übrigens später cachen und nicht jedesmal aus der Datenbank auslesen und neu strukturieren. Folglich spielt die Zeit zum Auslesen keine allzu große Rolle.

Grüße

Matze 2. Mär 2008 21:05

Re: [PHP] Datensätze als Baum darstellen
 
Hallo,

mich treibt die Rekursion noch in den Wahnsinn. :wall:

Wie kann man denn anhand einer ID die übergeordneten Einträge bekommen?

Beispiel:

Code:
Pflanzen
    Löwenzahn
Tiere
    Säugetiere
        Giraffe
        Maus
        Katze
    Vögel
        Adler
Nun gebe ich die ID von "Adler" an eine rekusrive Funktion und zurückgegeben werden sollen dann die Daten von: Vögel, Tiere

Meine Theorie sieht so aus:
Ich gehe rekursiv so lange die Datensätze durch, bis die gegebene ID gefunden wird und dann wird nach dem rekursiven Aufruf (also beim "Zurücklaufen") das zu zurückgebene Array gefüllt.

Nur die Praxis endet entweder in einer Endlosrekursion oder gibt mir etwas komplett falsches aus. :?

Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 Uhr.
Seite 3 von 4     123 4      

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