André Laugks: Baumstruktur in Datenbank ablegen

Beitrag lesen

Hallo!

zu deinem Beispiel: genau so sieht's bei mir aus! aber um das als Baum auszugeben benötige ich imens viele DB-zugriffe...
ist ja klar die NULL felder entsprechen den ROOTS. aber auf welche weise kämpfe ich mich da nun durch um eine Sinnvolle Reihenfolge von "beitr_num" zu ermitteln?

Da reicht ein Zugriff.

Die Beispiel hier habe ich für ein kleines Forum geschrieben http://www.readings.de/forum/forum.phtml.

Das ganze hier ist sehr einfach gestickt, der reguläre Ausdruck z.B., aber es funktioniert.

// Alle Datensätze mit NULL kommen in die Array $zeile_start_thread,
// der Rest in $zeile_antwort_thread.

while($db->fkt_fetch())
   {
      if(is_null($db->fetch["vornummer"])) // --> Anfangspostings
        {
            $zeile_start_thread[$db->fetch["id_forum"]] = array(
                                                            $db->fetch["id_forum"],
                                                            $db->fetch["betreff"],
                                                            $db->fetch["name"],
                                                            $db->fetch["datum"]);
         }
         else // --> Antwortpostings
            {
                $zeile_antwort_thread[$db->fetch["id_forum"]] = array(
                                                                $db->fetch["id_forum"],
                                                                $db->fetch["thread"],
                                                                $db->fetch["betreff"],
                                                                $db->fetch["name"],
                                                                $db->fetch["datum"],
                                                                $db->fetch["vornummer"],
                                                                $db->fetch["ebene"]);
            }
   }

// Dann die Arrays sortieren:

// absteigent
// IDs absteiget
array_multisort($zeile_start_thread, SORT_DESC);

// aufsteigent
// IDs aufstegent
array_multisort($zeile_antwort_thread, SORT_ASC);

// Nun schreibst Du die "Start-Postings" in ein Array.

$a = 0;
while(list($id, $inneres_array) = each($zeile_start_thread))
   {
     list($id, $betreff, $name, $datum) = $inneres_array;

$threads[$a] = "<ul><a href="beitrag.phtml?thread=" . $id . "&ebene=0&nr=". $id .""><b>" . $betreff . "</a></b> von " . $name . ", " . $datum;
     $a++;
     $threads[$a] = "</ul>";
     $a++;

}

// Nun sortierst Du die Antworten ein:

$a = 0;
while(list($id, $inneres_array) = each($zeile_antwort_thread))
{

list($id, $thread, $betreff, $name, $datum, $vornummer, $ebene) = $inneres_array;

$suchmuster = "nr=" . $vornummer . "">";

for($i = 0; $i < count($threads); $i++)
        {

$threads_neu[$a] = $threads[$i];
           $a++;

if(ereg($suchmuster, $threads[$i]) == true)
     {

$threads_neu[$a] = "<ul><a href="beitrag.phtml?thread=" . $thread . "&ebene=" . $ebene . "&nr=". $id ."">" . $betreff . "</a> von " . $name . ", " . $datum;
           $a++;
     $threads_neu[$a] = "</ul>";
     $a++;
     }
        }

$a = 0;
   $threads = $threads_neu;

}

Im Prinzip schiebst Du eine Antwort immer zwischen die Arrayelements. Du suchst im Array($thread) so lange, bist Du das Posting findest, von dem es die Antwort ist. Also 2 ist die Antwort auf 6. Ich suche also nach der 6 und schiebe die zwei rein und packe den Rest der Array($thread) dahinter. Die Array $neu_thread ist sozusagen eine temporäre Array, in der ich die neue ablege. Die neue lege ich dann wieder in der alten ab und es geht von vorne los.

Ich schreibe vorsorglich bestimmte sachen mit in die DB, wie die Postingebene. Ist für die Zukunft gedacht...

Es werden <ul></ul> verschatelt, daß ist nicht W3C konform!!!

MfG, André Laugks