2014-01-30 31 views
0

我想輸出一個HTML菜單和子菜單與MySQLi和PHP。輸出菜單與子菜單使用PHP和mysqli

我的經驗還不足以解決這個問題。

我可以幫忙嗎?

我有一個頁面下面的表結構:

CREATE TABLE `pages` (
    `id` int(100) NOT NULL AUTO_INCREMENT, 
    `page_name` varchar(255) NOT NULL, 
    `parent_id` int(100) NOT NULL, 
    `link` varchar(255) NOT NULL, 
    `target` varchar(255) NOT NULL, 
    `enabled` int(1) NOT NULL DEFAULT '1', 
    `sort` int(100) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; 

的記錄:

INSERT INTO `pages` VALUES ('1', 'Home', '0', 'index.php', '_self', '1', '1'); 
INSERT INTO `pages` VALUES ('2', 'Team', '0', 'team.php', '_self', '1', '2'); 
INSERT INTO `pages` VALUES ('3', 'Posts', '0', 'posts.php', '_self', '1', '3'); 
INSERT INTO `pages` VALUES ('4', 'Programs', '0', 'programs.php', '_self', '1', '4'); 
INSERT INTO `pages` VALUES ('5', 'Program Name 1', '4', 'program1.php', '_self', '1', '1'); 
INSERT INTO `pages` VALUES ('6', 'Program Name 2', '4', 'program2.php', '_self', '1', '2'); 
INSERT INTO `pages` VALUES ('7', 'Program Name 3', '4', 'program3.php', '_self', '1', '3'); 
INSERT INTO `pages` VALUES ('8', 'Contact', '0', 'contact.php', '_self', '1', '8'); 

我的目標是輸出類似的東西:

Home 
Team 
Posts 
Programs 
--Program Name 1 
--Program Name 2 
--Program Name 3 
Contact 

感謝

+0

有兩張桌子還是隻有一張? – hjpotter92

+0

只有一個。謝謝 –

回答

2

即時將細節留給自己,但它會是這樣的。 遞歸是關鍵字:

function getMenu($parent=0, $depth=0){ 
    $menu = "<ul>"; // each section gets wrapped in UL 
    // Select and query to get only the direct childs from $parent: 
    $qItems = "SELECT id, page_name FROM pages WHERE parent=".$parent; 
    $sItems = mysqli_query($conn, $qItems); 
    // This will be the magic part: 
    while($fItems = $sItems->fetch_assoc()){ 
     $menu.= '<li>'; 
     $menu.= str_repeat('-', $depth).' '.$fItems['page_name']; 
     $menu.= getMenu($fItems['id'], $depth+1); // <- this is the magic! This will get the childs of this item 
     $menu.= '</li>'; 
    } 

    $menu.= "</ul>"; // each section gets wrapped in UL 
    return $menu; // return it 
} 

echo getMenu(); // Do something with it :) 

我已經添加了$depth在這個例子中,因此短線得到的地方,向您展示如何找到自己的方式爲遞歸
編輯:小而重要的注意事項:如果您繼續向孩子添加孩子...,無需更新代碼,這將繼續無休止地繼續。這是遞歸的大國之一

+0

感謝它就像一個魅力! ;) –

+0

今天在遞歸系統上工作,所以它是在我的頭頂,沒有問題:) – Martijn

0

上面的答案比我的任何一天都好,但我記得有一個我被卡住,將這樣的列表填充爲select select的多選選項,然後再使用bootstrap ul li系統,有時你可能需要數組中的菜單系統以不同的方式填充,只是另一種方式以防萬一需要。 快樂編碼! :)

while($data = $mysqli_result->fetch_assoc()) 
{ 
    if ($data['parentId'] == 0) 
    $menu[$data['id']] = $data['page_name']; 
    else 
    $subMenu[$data['parentId']][$data['id']]=$data['page_name']; 
} 
foreach($menu as $k=>$m) 
{ 
    //echo $m here as you like..! 
    if(isset($submenu[$k])) 
    { 
     foreach($submenu[$k] as $sub) 
     { 
      //do with the submenu. 
     } 
    } 
} 
+0

而不是這種方式(這是很慢!在大數據集中PHP和數組很慢!)您可以創建一個新的而在這段時間...同樣的效果,但更快。 – Martijn

+0

不能同意更多!因爲和任何時候都比任何一天更快,效率更高! :) –