Mailinglisten-Archive |
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