Hannes: Verschachtelte Liste mit php erzeugen

Beitrag lesen

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