आपका कोड केवल दो स्तरीय मेनू उत्पन्न करेगा, यदि आपको अपने इच्छित किसी भी स्तर से गुजरना है, तो मुझे लगता है कि आपको रिकर्सन का उपयोग करने की आवश्यकता है।
यहां आपके डेटाबेस संरचना और नमूनों के आधार पर एक उदाहरण दिया गया है। उदाहरण में हम विभिन्न स्तरों में एक मेनू तैयार करेंगे, मेनू आइटम नामों के लिए अंग्रेजी लेबल का उपयोग किया जाता है।
<?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>
सभी स्तरों को आकर्षित करने के लिए:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
drawMenu
फ़ंक्शन निम्न के रूप में कार्य करता है:
- सबसे पहले हम एक
$db
पास करते हैं डेटाबेस क्वेरी करने के लिए आपत्ति,$parent
कि पेड़ के साथ शुरू होगा और$level
पेड़ के स्तर के लिए। - फ़ंक्शन दिए गए
$parent
. के बच्चे को चुनकर शुरू होगा और प्रत्येक के लिए लूप में जाएंforeach ($m->fetchAll() as $menu_row) {...}
। -
लूप में हमारे पास दो मामले हैं:
-
आइटम एक पत्ता है यानी अन्य वस्तुओं के लिए माता-पिता नहीं है, या हम पेड़ के अंतिम स्तर तक पहुंच जाते हैं। इस केस को बेस केस . कहा जाता है , जिसमें रिकर्सन रुक जाएगा और एक मान लौटाएगा
echo "<li>" . $menu_row['label'] . "</li>";
-
आइटम एक अभिभावक है, इस मामले में हम
drawMenu
. कहते हैं आइटम आईडी के साथ फिर से कार्य करें$menu_row[0]
एक अभिभावक और$level - 1
. के रूप में स्तरों के अंत तक पहुँचने पर रुकना सुनिश्चित करने के लिए।
-
कोड का परीक्षण करें और अपनी आवश्यकताओं के अनुसार इसे बदलें।