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.)