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
$db
objek untuk membuat kueri basis data,$parent
bahwa pohon akan dimulai dengan dan$level
untuk 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
drawMenu
berfungsi lagi dengan id item$menu_row[0]
sebagai induk dan$level - 1
untuk memastikan berhenti saat mencapai akhir level.
-
Uji kode dan ubah agar sesuai dengan kebutuhan Anda.