表的结构如:Id(int) PNodeId(int) MenuName(char)
1 0 一级菜单
2 1 菜单1
3 1 菜单2
4 1 菜单3
5 1 菜单4
6 1 菜单5
7 1 菜单6
8 1 菜单7
9 1 菜单8
10 1 菜单9
11 1 菜单10
12 1 菜单11
13 1 菜单12
14 2 菜单13
15 2 菜单14
16 2 菜单15
17 15 菜单16
18 15 菜单17我的思路是:根据id查找有多少PNodeId为1的数据,然后构建一级菜单,然后根据这些一级菜单所属的id号查找二级菜单(如第二条数据,id 为2,则查找 PNodeId为2的数据,再递归PNodeId为2的第一条记录,id为14,依次类推)建出来的树的应为:
一级菜单
|_菜单1
| |_菜单13
| |_菜单14
| | |_菜单16
| | |_菜单17
| |_菜单15
|_菜单2
|_菜单3
|_菜单4
|_菜单5
|_菜单6
|_菜单7
|_菜单8
|_菜单9
|_菜单10
|_菜单11
|_菜单12请大家帮帮我,急!!
1 0 一级菜单
2 1 菜单1
3 1 菜单2
4 1 菜单3
5 1 菜单4
6 1 菜单5
7 1 菜单6
8 1 菜单7
9 1 菜单8
10 1 菜单9
11 1 菜单10
12 1 菜单11
13 1 菜单12
14 2 菜单13
15 2 菜单14
16 2 菜单15
17 15 菜单16
18 15 菜单17我的思路是:根据id查找有多少PNodeId为1的数据,然后构建一级菜单,然后根据这些一级菜单所属的id号查找二级菜单(如第二条数据,id 为2,则查找 PNodeId为2的数据,再递归PNodeId为2的第一条记录,id为14,依次类推)建出来的树的应为:
一级菜单
|_菜单1
| |_菜单13
| |_菜单14
| | |_菜单16
| | |_菜单17
| |_菜单15
|_菜单2
|_菜单3
|_菜单4
|_菜单5
|_菜单6
|_菜单7
|_菜单8
|_菜单9
|_菜单10
|_菜单11
|_菜单12请大家帮帮我,急!!
$m[0][0]=1;$m[0][1]=0;$m[0][1]='一级菜单 ';
...
$m[17][0]=18;$m[17][1]=15;$m[17][1]='菜单12 ';//下面是递归函数
function ShowMenu($id){
global $str,$spc,$m;
$spc.=' ';
for($i=0;$i<sizeof($m);$i++){
if($m[$i][0]==$id){
$str.=$spc.$m[$i][2].'<br>';
ShowMenu($m[$i][1]);//递归调用
}
}ShowMenu(1);
echo $str;
//代码结束
当然这段代码只是实现多级菜单的一个主体,实际应用时还要考虑菜单前面的小图片、菜单的打开与隐藏,当你完善这个代码后就可以做得象资源管理器一样实用方便。因为要实现全部功能,代码较长,不便粘贴,请见谅!
其实先前所贴的代码还可以进行优化,只不过对我来说,递归代码本来可读性就不好,索性就这样简简单单的贴出来
如果你能看懂PHP的话,以上的代码应该很好懂,也很好移植至DELPHI。当算法问题解决了,代码只是水到渠成的哟!
var
I:integer;
qry:TAdoquery;
begin
Qry:=Tadoquery.create(nil);
Qry.connetion:=conn;
qry.sql.clear;
qry.sql.add('select * from tablename where PNodeId='+parentID);
qry.active:=true;
qry.first;
for i:=0 to qry.recordcount-1 do
begin
mytree.addchild()/具体参数忘了,请自己写
Addtree(qry.fieldbyname('Id').asinteger,mytree,conn);
end;
qry.free;
end
select * from tablename where PNodeId='parentID' order by PNodeID, ID
一次再数据取回来,然后来用递归查找这个数据集建菜单