verschachtelte Abfrage optimieren

psifactory

Erfahrenes Mitglied
Hallo,

ich habe folgende Datenstruktur in meiner DB

Code:
id    |name        |parent       |haupt
---------------------------------------
1     |peter       |             |true
2     |mandy       |1            |false
3     |steffi      |1            |false
4     |hans        |2            |false
5     |jürgen      |2            |false
6     |thomas      |4            |false
7     |karo        |4            |false

jetzt will ich einen verschachtelten Baum daraus erzeugen

Code:
peter
    -mandy
        -hans
            -thomas
            -karo
        -jürgen
    -steffi

Mein PHP Code sieht wie folgt aus:

PHP:
foreach ($result as $haupt) {
    if ($haupt['haupt'] == TRUE){
        echo $haupt['name'];
        foreach ($result as $sub) {
            if ($haupt['id'] == $sub['parent']){
                echo "</br>";
                echo "-".$sub['name'];
                foreach ($result as $subsub){
                    if ($sub['id'] == $subsub['parent']){
                        echo "</br>";
                        echo "--".$subsub['name'];
                        foreach ($result as $subsubsub){
                            if ($subsub['id'] == $subsubsub['parent']){
                                echo "</br>";
                                echo "---".$subsubsub['name'];
                            }
                        }
                    }
                }
            }
        }
    }
}

Die Preisfrage ist wie kann ich diese verschachtelte Ausgabe verkleinern/optimieren auch in Hinblick darauf dass ich die Tiefe des Baums grundsätzlich nicht weiss? Bin leider schon etwas länger raus in Sachen Programmierung..
 
Ich würde dir empfehlen dich mit Referenzen zu beschäftigen, damit lässt sich der Code etwas Optimieren und Übersichtlicher machen.

Ein kleiner bis großer Denkanstoss kannst du hier dazu finden
 
Boa, was ich so alles geschrieben habe. Diese Klasse habe ich selber inzwieschen völlig vergessen (Ich arbeite seit längerem nicht mehr aktiv mit PHP). Aber sie gefällt mir :)
 
Ich würde dir empfehlen dich mit Referenzen zu beschäftigen, damit lässt sich der Code etwas Optimieren und Übersichtlicher machen.
Ein kleiner bis großer Denkanstoss kannst du hier dazu finden

Das Beispiel zeigt aber nur eine 2-Fache Hirachie auf oder? In meinem Fall wo ich nicht sicher weiss wieviele Ebenen ich habe könnte ich da dann auch mit Referenzen arbeiten? Bzw. machen diese meine Funktion nicht zu unübersichtlich?


Ja nicht ganz. Brauche ja noch mehr Werte aus der DB und diese müssen dann mit einer Liste dargestellt werden. In meinem Beitrag diente das nur als Beispiel.
 
Habe gerade eine Lösung gefunden wie ich das angehe.
Musste erstmal mein Array umsortieren damit ich das dann richtig ausgeben kann.
PHP:
function unflattenArray($flatArray){
  $refs = array(); //for setting children without having to search the parents in the result tree.
    $result = array();

    //process all elements until nohting could be resolved.
    //then add remaining elements to the root one by one.
    while(count($flatArray) > 0){
        for ($i=count($flatArray)-1; $i>=0; $i--){
            if ($flatArray[$i]["parent"]==0){
                //root element: set in result and ref!
                $result[$flatArray[$i]["id"]] = $flatArray[$i];
                $refs[$flatArray[$i]["id"]] = &$result[$flatArray[$i]["id"]];
                unset($flatArray[$i]);
        $flatArray = array_values($flatArray);
            }

            else if ($flatArray[$i]["parent"] != 0){
                //no root element. Push to the referenced parent, and add to references as well.
                if (array_key_exists($flatArray[$i]["parent"], $refs)){
                    //parent found
                    $o = $flatArray[$i];
                    $refs[$flatArray[$i]["id"]] = $o;
          $refs[$flatArray[$i]["parent"]]["children"][] = &$refs[$flatArray[$i]["id"]];
                    unset($flatArray[$i]);
          $flatArray = array_values($flatArray);
                }
            }
        }
  }
  return $result;
}
 

Neue Beiträge

Zurück