Verschachtelte Liste mit php erzeugen
Flo Böhmisch
- php
0 Hannes
Hi und Hilfe!
Versuche eine Verschachtelte Liste mit php erzeugen.
Das gabs schon mal hier:
http://forum.de.selfhtml.org/archiv/2006/8/t134213/
ich verstehe hier einige Dinge nicht:
"
Hi,
zunächst mal würde ich empfehlen, das Menü in ein zweidimensionales Array einzulesen (hierzu finde ich die Art der Speicherung in der Datenbank allerdings unpraktisch.
Ich habe z.B. auf einer Seite ein solches Array $nav mit den erforderlichen Angaben zur Navigation. Zusätzlich habe ich vorab noch ein Array $subnav mit der hieraus berechneten Anzahl der Untermenüpunkte angelegt. Der Code sieht dann - vereinfacht - so aus:
$menu = ' <ul>'.$cr;
for($i=0; $i<count($nav); $i++) {
$menu .= ' <li><a href="'.$nav[$i][1].'">'.$nav[$i][2].'</a>';
if($subnav[$i]) {
$menu .= '<ul>'.$cr;
for($ii=0; $ii<$subnav[$i]; $ii++) {
$menu .= ' <li><a href="'.$nav[$i][$ii+$navinfo][1].'">'.$nav[$i][$ii+$navinfo][2].'</a></li>'.$cr;
}
$menu .= ' </ul>';
}
$menu .= '</li>'.$cr;
}
$menu .= ' </ul>'.$cr;
freundliche Grüße
Ingo
"
Was steht in dem array $subnav und vor allem wie?
Wie funktioniert :$nav[$i][$ii+$navinfo][1] und $nav[$i][$ii+$navinfo][2]?
Was wird hier von wo ausgelesen?
Wieso ist startet der letzte Key 1 und nicht 0?
Falls Ingo Turski das lesen sollte: Poste doch bitte die Array´s, damit ich das nachvollziehen kann.
Anyway, hier kommen ich alleine, mit meinem PHP-Stand nicht weiter.
Kann jemand Helfen?
Flo
Hallo,
Versuche eine Verschachtelte Liste mit php erzeugen.
Das gabs schon mal hier: http://forum.de.selfhtml.org/archiv/2006/8/t134213/.
$menu = ' <ul>'.$cr;
for($i=0; $i<count($nav); $i++) {
$menu .= ' <li><a href="'.$nav[$i][1].'">'.$nav[$i][2].'</a>';
if($subnav[$i]) {
$menu .= '<ul>'.$cr;
for($ii=0; $ii<$subnav[$i]; $ii++) {
$menu .= ' <li><a href="'.$nav[$i][$ii+$navinfo][1].'">'.$nav[$i][$ii+$navinfo][2].'</a></li>'.$cr;
}
$menu .= ' </ul>';
}
$menu .= '</li>'.$cr;
}
$menu .= ' </ul>'.$cr;
Was steht in dem array $subnav und vor allem wie?
Das:
Zusätzlich habe ich vorab noch ein Array $subnav mit der hieraus berechneten Anzahl der Untermenüpunkte angelegt.
Er hat also vor der Ausgabe das Menüfeld $nav durchlaufen und gezählt, wie viele Menüpunkte da drin sind. Das ist IMHO überflüssig und fehleranfällig, und nicht nur aus diesem Grund finde ich den Code suboptimal.
Wie funktioniert :$nav[$i][$ii+$navinfo][1] und $nav[$i][$ii+$navinfo][2]?
Ingo hat in $nav[0] bis $nav[n] die Hauptebene des Menüs gespeichert. Jeder Eintrag $nav[n] enthält ein weiteres Feld, in dem an Position 1 und 2 URL und Bezeichnung abgelegt sind ($nav[n][1] und $nav[n][2]).
An den darauf folgenden Positionen ($nav[n][3] bis $nav[n][m]) kommen die Untermenüpunkte, auch diese sind wieder Felder, die an 1 und 2 URL und Bezeichner führen (URL: $nav[n][m][1], $nav[n][m][2] Bezeichner).
Wieso ist startet der letzte Key 1 und nicht 0?
Vielleicht mag Ingo keine Nullen …
Getreu dem Motto "Nicht (nur) meckern, besser machen" mein Vorschlag:
$nav = Array();
// Erster Menüpunkt, kein Untermenü
$nav[] = Array("url" => "http://url1", "text" => "Text 1");
// Zweiter Menüpunkt, Untermenü mit drei Einträgen
$sub = Array("url" => "http://url2.1", "text" => "Text 2.1");
$sub[] = Array("url" => "http://url2.2", "text" => "Text 2.2");
$sub[] = Array("url" => "http://url2.3", "text" => "Text 2.3");
$nav[] = Array("url" => "http://url2", "text" => "Text 2", "sub" => $sub);
// Dritter Menüpunkt, Untermenü mit einem Eintrag
$sub = Array("url" => "http://url3.1", "text" => "Text 3.1");
$nav[] = Array("url" => "http://url3", "text" => "Text 3", "sub" => $sub);
$menue = "<ul>\n";
foreach ($nav as $a) {
$menue .= ' <li><a href="' . htmlspecialchars($a["url"]) . '">' . $a["text"] . "</a>\n";
if (isset($a["sub"])) {
$menue .= " <ul>\n";
foreach ($a["sub"] as $b) {
$menue .= ' <li><a href="' . htmlspecialchars($b["url"]) . '">' . $b["text"] . "</a></li>\n";
}
$menue .= "</ul>\n";
}
$menue .= "</li>\n";
}
$menue .= "</ul>\n";
(Anmerkung: htmlspecialchars() habe ich bei der Ausgabe des Textes absichtlich weggelassen, damit man die Menüpunkte frei dekorieren kann.)
Hallo Hannes,
vielen Dank für Deine Hilfe - jetzt blick ichs und es funktioniert!
zunächst sind mal ein paar wilde Sachen passiert. Menüpunkte aus nur 1 Buchstaben, der im Arrayinhalt gar nicht vorkommt etc...
laf wohl an den fehlenden [] im ersten $sub...
$sub = Array("url" => "http://url2.1", "text" => "Text 2.1");
$sub[] = Array("url" =>...
mit den Dingern haben sich die Untermenüpunkte dann von mal zu mal aufaddiert...
$sub[] = Array("url" => "http://url2.1", "text" => "Text 2.1");
$sub[] = Array("url" =>...
Hab dann das Array $sub vor jedem Menüpunkt neu definiert:
$nav = Array();
$sub = Array();
// Erster Menüpunkt, Untermenü
$sub[] = Array("url" => "formatico_wir.php", "text" => "Wir");
$sub[] = Array("url" => "formatico_technik.php", "text" => "Technik");
$sub[] = Array("url" => "formatico_faq_download.php", "text" => "FAQ’s / Download");
$nav[] = Array("url" => "index.php", "text" => "Formatico", "sub" => $sub);
// Zweiter Menüpunkt, Untermenü
$sub = Array();
$sub[] = Array("url" => "service_printbig.php", "text" => "Text 2.1");
$sub[] = Array("url" => "service_schneidegraphiken.php", "text" => "Schneidegraphik");
$sub[] = Array("url" => "service_3dgraphiken.php", "text" => "3D Graphik");
$sub[] = Array("url" => "service_badges.php", "text" => "Badges");
$sub[] = Array("url" => "service_verarbeitung.php", "text" => "Verarbeitung");
$sub[] = Array("url" => "service_praesentationssysteme.php", "text" => "Präsentationssysteme");
$nav[] = Array("url" => "service.php", "text" => "Service", "sub" => $sub);
// Dritter Menüpunkt, Untermenü
$sub = Array();
$sub[] = Array("url" => "referenzen_mini.php", "text" => "Mini");
$sub[] = Array("url" => "referenzen_ibm.php", "text" => "IBM");
$sub[] = Array("url" => "referenzen_brauninger.php", "text" => "Bräuninger");
$nav[] = Array("url" => "referenzen.php", "text" => "Referenzen", "sub" => $sub);
// Dritter Menüpunkt, Untermenü
$sub = Array();
$sub[] = Array("url" => "anfahrt.php", "text" => "Anfahrt");
$sub[] = Array("url" => "impressum.php", "text" => "Impressum");
$nav[] = Array("url" => "kontakt.php", "text" => "Kontakt", "sub" => $sub);
$menue = "<ul>\n";
foreach ($nav as $a) {
$menue .= ' <li><a href="' . /* htmlspecialchars (*/$a["url"]/* ) */ . '">' . $a["text"] . "</a>\n";
if (isset($a["sub"])) {
$menue .= " <ul>\n";
foreach ($a["sub"] as $b) {
$menue .= ' <li><a href="' . /* htmlspecialchars( */$b["url"]/* ) */ . '">' . $b["text"] . "</a></li>\n";
}
$menue .= "</ul>\n";
}
$menue .= "</li>\n";
}
$menue .= "</ul>\n";
so läuft es perfeckt...
Flo