Mã của bạn sẽ chỉ tạo menu hai cấp, nếu bạn cần phải đi qua bất kỳ cấp nào bạn muốn, tôi nghĩ rằng bạn cần sử dụng đệ quy.
Đây là một ví dụ dựa trên cấu trúc cơ sở dữ liệu và các mẫu của bạn. Trong ví dụ này, chúng tôi sẽ tạo một menu ở các cấp độ khác nhau, các nhãn tiếng Anh được sử dụng cho tên các mục 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>
Để vẽ tất cả các cấp:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
drawMenu
chức năng hoạt động như sau:
- Đầu tiên, chúng tôi chuyển một
$db
đối tượng để thực hiện các truy vấn cơ sở dữ liệu,$parent
mà cây sẽ bắt đầu bằng và$level
đối với cấp độ của cây. - Hàm sẽ bắt đầu bằng cách chọn con của
$parent
đã cho và lặp lại từng cái mộtforeach ($m->fetchAll() as $menu_row) {...}
. -
Trong vòng lặp, chúng ta có hai trường hợp:
-
Vật phẩm là một chiếc lá, tức là không phải là cha mẹ của các vật phẩm khác, hoặc chúng ta đạt đến cấp độ cuối cùng của cây. Trường hợp này được gọi là Trường hợp cơ sở , trong đó phép đệ quy sẽ dừng lại và trả về một giá trị
echo "<li>" . $menu_row['label'] . "</li>";
-
Mục là cha, trong trường hợp này chúng tôi gọi là
drawMenu
hoạt động lại với id mục$menu_row[0]
với tư cách là cha mẹ và$level - 1
để đảm bảo dừng lại khi đạt đến cuối các cấp.
-
Kiểm tra mã và thay đổi mã để phù hợp với nhu cầu của bạn.