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
$dbobjekt för att göra databasfrågor,$parentatt trädet börjar med och$levelför nivån på trädet. - Funktionen börjar med att välja barnet till den givna
$parentoch 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
drawMenufungerar igen med objekt-id:t$menu_row[0]som förälder och$level - 1fö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.