我想在悬停时制作带子菜单的导航菜单。我想从我的数据库中获取这些数据(如果数据库中的数据更改菜单栏更改,则使其动态化)。在我的数据库中,我有一个包含以下字段的表:
ID
,Name
,Level
,Parent_id
。 Level
可以是0
或1
。子菜单的主菜单0
为1
,主菜单的id
与parent_id
字段相关联。
例如:
ID Name Level Parent_id
1 Test 0
2 Test2 0
3 Test_sub 1 1
4 Test_sub2 2 2
我已经设法从数据库中获取主菜单项,但现在我有点卡住了。这是我的代码,任何帮助都会得到满足。
<?php
$q2= "SELECT * from menu where level = 0 ";
$q2result = $db->query($q2);
while($a2 = $q2result->fetch(PDO::FETCH_ASSOC)){
echo "
<ul>
<li><a href='#' ><span> " . $a2['name'] . " </span></a>
<ul>
<li><a href='#' ><span> test </span></a></li>
</ul>
</ul>
";
}
?>
答案 0 :(得分:0)
首先将所有数据加载到变量中。在SQL语句中永远不要打印/回显。
<?php
$q2= "SELECT * FROM menu ORDER BY Level ASC";
$q2result = $db->query($q2);
$nodes=array();
while($a2 = $q2result->fetch(PDO::FETCH_ASSOC)){
// assuming one parent node has already been assigned, due do level order into the SQL
if($node['Level']>0 && isset($nodes[$a2['id']])) {
$nodes[$a2['id']]['nodes'][]=$a2;
} else {
// parent node
$nodes[$a2['id']]=$a2;
$nodes[$a2['id']]['nodes']=array();
}
}
print "<ul>";
foreach($nodes as $node) {
print "<li>";
print "<a href='#'>".$node['Name']."</a>";
if(sizeof($node['nodes'])>0) {
print "<ul>";
foreach($node['nodes'] as $subnode) {
print "<li><a href='#'>".$subnode['Name']."</a></li>";
}
print "</ul>";
}
print "</li>";
}
print "</ul>";
?>
这可能会有更多改进,但有了这个,你可以做你所要求的,并改进它。