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