【问题标题】:Output menu with submenu using php and mysqli使用 php 和 mysqli 输出带有子菜单的菜单
【发布时间】:2014-02-22 18:17:58
【问题描述】:

我正在尝试使用 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

谢谢

【问题讨论】:

  • 是有两张桌子还是只有一张?

标签: php menu mysqli submenu


【解决方案1】:

我将把细节留给你自己,但它会是这样的。 递归是关键字:

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,这样破折号就可以放置,以展示如何找到递归的方式
编辑:小而重要的注意事项:这将继续如果您不断将 childs to childs to ... 添加到...,则无需更新代码。这是递归的强大功能之一

【讨论】:

  • 今天在递归系统上工作,所以它在我的脑海中,没问题:)
【解决方案2】:

上面的答案比我的要好,但我记得有一次我被困在使用 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.
        }
    }
}

【讨论】:

  • 而不是这种方式(这很慢!PHP 和数组在大型数据集中时速度很慢!)您可以在一段时间内创建一个新的一段时间......同样的效果,但更快。
  • 不能再同意了! for and while 比 foreach 更快、更高效! :)
猜你喜欢
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2023-03-06
  • 2018-06-07
  • 2012-03-08
  • 1970-01-01
  • 2014-02-20
相关资源
最近更新 更多