Din kod kommer bara att generera två nivåer meny, om du behöver gå igenom någon nivå du vill, jag tror att du måste använda rekursion.
Här är ett exempel baserat på din databasstruktur och exempel. I exemplet kommer vi att generera en meny på olika nivåer, de engelska beteckningarna används för menyobjekts namn.
<?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>
Så här ritar du alla nivåer:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
drawMenu
funktionen fungerar enligt följande:
- Först skickar vi en
$db
objekt för att göra databasfrågor,$parent
att trädet börjar med och$level
för nivån på trädet. - Funktionen börjar med att välja barnet till den givna
$parent
och gå i loop för var och enforeach ($m->fetchAll() as $menu_row) {...}
. -
I slingan har vi två fall:
-
Föremålet är ett löv, det vill säga inte en förälder för andra föremål, eller så når vi den slutliga nivån av träd. Detta fall kallas Base case , där rekursionen kommer att stoppa och returnera ett värde
echo "<li>" . $menu_row['label'] . "</li>";
-
Objektet är en förälder, i det här fallet kallar vi
drawMenu
fungerar igen med objekt-id:t$menu_row[0]
som förälder och$level - 1
för att se till att stoppa när du når slutet av nivåerna.
-
Testa koden och ändra den så att den passar dina behov.