使用php和mysqli的子菜单输出菜单

时间:2014-01-30 12:29:50

标签: php menu mysqli submenu

我正在尝试使用 MySQLi 和PHP输出HTML菜单和子菜单。

我的经验不足以解决这个问题。

我可以帮忙吗?

我有以下表格结构:

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

由于

2 个答案:

答案 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,以便破折号出现,以显示如何找到进入递归的方式
修改:小而重要的注意事项:如果您继续将子项添加到子项... ,这将继续无休止,无需更新代码。这是递归的强大力量之一

答案 1 :(得分:0)

上面的答案比我的任何一天都要好,但是我记得有一个问题,我把这个列表填充为select2的多选项,然后再用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.
        }
    }
}