Din kode vil kun generere en menu på to niveauer, hvis du har brug for at gennemgå et hvilket som helst niveau, du ønsker, tror jeg, at du skal bruge rekursion.
Her er et eksempel baseret på din databasestruktur og eksempler. I eksemplet vil vi generere en menu på forskellige niveauer, de engelske etiketter bruges til menupunkters navne.
<?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ådan tegner du alle niveauer:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
drawMenu
funktion fungerer som følgende:
- Først sender vi en
$db
objekt for at lave databaseforespørgsler,$parent
at træet starter med og$level
for træets niveau. - Funktionen starter med at vælge barnet til den givne
$parent
og gå i loop for hverforeach ($m->fetchAll() as $menu_row) {...}
. -
I løkken har vi to tilfælde:
-
Genstanden er et blad, dvs. ikke en forælder til andre varer, eller vi når det endelige niveau af træ. Denne sag kaldes Basissagen , hvor rekursionen stopper og returnerer en værdi
echo "<li>" . $menu_row['label'] . "</li>";
-
Elementet er en forælder, i dette tilfælde kalder vi
drawMenu
funktion igen med element-id'et$menu_row[0]
som forælder og$level - 1
for at sørge for at stoppe, når du når slutningen af niveauerne.
-
Test koden, og skift den, så den passer til dine behov.