phpbar.de logo

Mailinglisten-Archive

[php] Baumstruktur Mysql->Array (nicht Nested set Modell)

[php] Baumstruktur Mysql->Array (nicht Nested set Modell)

Peter Bieling network at media-palette.de
Mon Nov 7 12:17:51 CET 2005


Hallo Norbert,

Norbert Pfeiffer wrote:

> man heisst ja immer, dass rekursive Querys Resourcen fressen !
> Deshalb bevorzuge ich die Variante, alles in einem Zug auszulesen
> und mittels PHP mundgerecht zu machen. Und damit das auch Hand und
> Fuss bekommt, habe ich Peters Loesung gegen die PHP-Variante um
> die Wette laufen lassen:
> - es muessen 12 Querys von MySQL beantwortet werden:   18,883 ms
> - dagegen die einzelne Abfrage mit PHP-Nachbesserung:   2,514 ms
> Denke, das sagt alles !

na klar, das sind knap 2 Hundertstel Vorsprung. Auf der Basis werden 
Weltrekorde verbessert. ;-)
Nein im Ernst: Ich finde Deine Lösung ganz gut, und ich hoffe, Du hast 
nichts dagegen, wenn wir die verwenden?

Das rekursive Prinzip, nach dem  der OP gefragt hatte, ist übrigens in 
beiden Varianten gleich.

BTW: Hast Du mal probiert, wie groß der Zeitunterschied ist, wenn Du das 
assoziative Array von MySQL bauen lässt? :
  while ($row  =  mysql_fetch_array($result, MYSQL_ASSOC)) {
                  $res_arr[] = $row;
  }
(Ich hab's noch nicht probiert.)

Hier ist mir nicht ganz klar, was Du damit bezweckst. Kann es sein, dass 
Du Dich da vertan hast? :

>    $maxD = ($dept > $maxD) ? $dept : $maxD;

Noch eine Anmerkung zum Level (bei Dir depth.)

Der lässt sich auch bei der rekursiven Ausgabe ermitteln und nutzen.
Beispiel zur Ausgabe einer Sitemap:

function build_sitemap ($tree , $level=1) {
     global $nav; //Templateobjekt
     $html_buffer = '';
     foreach ($tree as $k => $v_arr) {
         $tmp = '';
         //Wenn kein nächster Level da ist auf leer setzen.
         if (!isset($v_arr['nextlevel'])) {
              $v_arr['nextlevel'] = '';
         } else if (is_array($v_arr['nextlevel'])) {
            $tmp = build_sitemap ($v_arr['nextlevel'], $level+1);
         }
         $v_arr['nextlevel'] = $tmp;
         $v_arr['level'] = $level;
         $html_buffer .= $nav->fill_tpl('links', $v_arr);
     }
     return  $nav->fill_tpl ('navi', 'links', $html_buffer);
}


################################################
# Template
[navi]
<ul>{LINKS}</ul>

[links]
<li><a class="level{LEVEL}" href="/{URL}">{LABEL}</a>{NEXTLEVEL}</li>

# Templatklasse:
#http://www.media-palette.de/tools/pb-tpl/
# Ausgabebeispiel bei etwas erweitertem Template:
# http://www.media-palette.de/test/sitemap1.html
##################################################

Übrigens ist es eine gute Idee das Navigationsarray zu serialisieren und 
speichern, falls sich nicht ständig etwas ändert:
save_string(serialize($navi_tree), $navifile);
Dann ist es fast egal, ob man rekursiv die DB abfragt. (z.B. einmal im 
Monat. ;-) )

Viele Grüße

Peter





php::bar PHP Wiki   -   Listenarchive