Christian Seiler: Dynamisches Menü

Beitrag lesen

Hallo,

Stimmt, klingt logisch. Nur beim letzten Eintrag muss die parent_id = 4 sein, oder?

oops - ist mir gar nicht aufgefallen (dann ist auch das andere Diagramm falsch)

Sagt mit jetzt nichts, gibts dazu doku?

Rekursiv heißt, dass die Funktion sich selber aufruft (und dabei möglichst keine Endlosschleife produziert ;) )

Doku im Internet wüßte ich jetzt nicht ... hab' mal kurz gegoogled und mal abgesehen von UNI-Material (was sehr theoretisch und abstrakt ist) habe ich ein extrem einfaches Beispiel gefunden - da isses sogar in JavaScript: http://www.robert-web.de/rekursiv.shtml Vielleicht gibt's Dir ja einen ersten Einblick.

Noch etwas: bei Rekursiven Funktionen wird's erst richtig nett, wenn Du werde in zwei Richtungen (Verschachtelungsebenen rauf/runter) übertragen musst - da musst Du erst mal wirklich überlegen.

Da Du aber 0 Ahnung hast, programmiere ich mal schnell das Grundgerüst:

Eine Rekursive Funktion für so eine Liste müsste aber etwa so verfahren:

Vorraussetzung: Es muss eine Funktion get_menu_list geben, die einen Array von assoziativen Arrays zurückliefern à la

$list = array (
  array ("id" => 1, "name" => "...", "sonstwas" => "sonstwas"),
  array ("id" => 2, "name" => "...", "sonstwas" => "sonstwas"),
  array ("id" => 3, "name" => "...", "sonstwas" => "sonstwas")
);

function create_menu_tree ($user, $parentid = 0, $indent = 0)
{
  $final_list = array ();
  $list = get_menu_list ($user, $parentid);
  // nun wird die liste abgearbeitet
  foreach ($list as $listitem) {
    $listitem["indent"] = $indent;
    $final_list[] = $listitem;
    $new_list = create_menu_tree ($user, $listitem["id"], $indent + 1);
    // wenn es Einträge für dieses Menü gibt
    if (count ($new_list) > 0) {
      $final_list = array_merge ($final_list, $new_list);
    }
  }
  return $final_list;
}

Die Funktion liefert dann eine Liste zurück, die Du dann z.B. so ausgeben kannst:

$list = create_menu_tree ($user);

foreach ($list as $listitem) {
  echo str_repeat ("  ", $listitem["indent"]);
  echo $listitem["name"];
  echo "<br />\n";
}

Dann käme so eine (Beispiel-)Ausgabe:

Menü
  Untermenü
  Untermenü
    Unter-Untermenü
Menü
  Untermenü

Du könntest natürlich auch eine Tabelle ausgeben und vieles mehr - such Dir etwas aus ... :-)

Glaub nicht dass das geht, da dies ein CMS sein soll und das menü soll die navigation der seite wiederspiegeln

Naja - ich wußte ja nicht genau, wofür das gut sein sollte ...

Grüße,

Christian