Kode Anda hanya akan menghasilkan dua menu level, jika Anda perlu melalui level apa pun yang Anda inginkan, saya pikir Anda perlu menggunakan rekursi.
Berikut adalah contoh berdasarkan struktur dan sampel database Anda. Dalam contoh kita akan menghasilkan menu di tingkat yang berbeda, label bahasa Inggris digunakan untuk nama item menu.
<?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>
Untuk menggambar semua level:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
drawMenu fungsinya sebagai berikut:
- Pertama kita melewati
$dbobjek untuk membuat kueri basis data,$parentbahwa pohon akan dimulai dengan dan$leveluntuk tingkat pohon. - Fungsi akan dimulai dengan memilih anak dari
$parent. yang diberikan dan masuki loop untuk masing-masingforeach ($m->fetchAll() as $menu_row) {...}. -
Dalam loop kita memiliki dua kasus:
-
Item adalah daun yaitu bukan induk untuk item lain, atau kita mencapai level akhir pohon. Kasus ini disebut Kasus dasar , di mana rekursi akan berhenti dan mengembalikan nilai
echo "<li>" . $menu_row['label'] . "</li>"; -
Item tersebut adalah parent, dalam hal ini kita sebut
drawMenuberfungsi lagi dengan id item$menu_row[0]sebagai induk dan$level - 1untuk memastikan berhenti saat mencapai akhir level.
-
Uji kode dan ubah agar sesuai dengan kebutuhan Anda.