Ihr Code generiert nur ein Menü mit zwei Ebenen. Wenn Sie eine beliebige Ebene durchlaufen müssen, müssen Sie meiner Meinung nach die Rekursion verwenden.
Hier ist ein Beispiel, das auf Ihrer Datenbankstruktur und Ihren Beispielen basiert. Im Beispiel generieren wir ein Menü in verschiedenen Ebenen, die englischen Bezeichnungen werden für die Namen der Menüelemente verwendet.
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
function drawMenu($db, $parent, $level = null){
$m = $db->prepare(" SELECT * FROM
administrator_menu, administrator_menu_description
where administrator_menu.id = administrator_menu_description.id
and language_id = 2
and parent_id = $parent");
$m->execute();
foreach ($m->fetchAll() as $menu_row) {
$m = $db->prepare("SELECT count(*) FROM administrator_menu where parent_id = $menu_row[id]");
$m->execute();
// The item is parent, so do recursion again
if($m->fetchAll()[0][0] !== '0' && $level !== 0){
echo "<li>" . $menu_row['label']."<ul>";
drawMenu($db, $menu_row[0], $level - 1);
echo "</ul></li>";
}else{ // The item is a leaf or we reach the end level, i.e. base case, so do print the item label
echo "<li>" . $menu_row['label'] . "</li>";
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<?php
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 0); // level 0
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 1); // level 1
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 2); // level 2
echo "</ul></div>";
?>
</body>
</html>
So zeichnen Sie alle Ebenen:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
Das drawMenu
Funktion funktioniert wie folgt:
- Zuerst übergeben wir ein
$db
Objekt, um Datenbankabfragen zu machen,$parent
mit dem der Baum beginnt und$level
für die Ebene des Baums. - Die Funktion beginnt mit der Auswahl des untergeordneten Elements des angegebenen
$parent
und gehe in eine Schleife für jedenforeach ($m->fetchAll() as $menu_row) {...}
. -
In der Schleife haben wir zwei Fälle:
-
Das Element ist ein Blatt, d. h. kein übergeordnetes Element für andere Elemente, oder wir erreichen die letzte Ebene des Baums. Dieser Fall wird als Basisfall bezeichnet , in dem die Rekursion stoppt und einen Wert zurückgibt
echo "<li>" . $menu_row['label'] . "</li>";
-
Das Element ist ein übergeordnetes Element, in diesem Fall nennen wir das
drawMenu
Funktion wieder mit der Element-ID$menu_row[0]
als Elternteil und$level - 1
um sicherzustellen, dass Sie aufhören, wenn Sie das Ende des Levels erreichen.
-
Testen Sie den Code und passen Sie ihn an Ihre Bedürfnisse an.