我正在尝试使用 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
由于
答案 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.
}
}
}