所以最终菜单看起来像这样:
Item B Item B-1 Item B-1-2 Item B-1-1 Item A SubItem A-1 SubItem A-2 Item C
基于以下DB记录:
id menu_title parent_menu_id menu_level weight 1 Item A 0 1 1 2 Item B 0 1 0 3 Item C 0 1 2 4 SubItem A-2 1 2 1 5 Item B-1 2 2 0 6 Item B-1-1 5 3 1 7 SubItem A-1 1 2 0 8 Item B-1-2 5 3 0
我该怎么去展示?我的猜测是它将涉及将所有项目存储到一个多维数组中,然后以某种方式循环遍历它...
在关系数据库(不包括Oracle,其中有运营商START WITH/CONNECT BY
来处理这个)中,分层数据有点烦人.基本上有两种模型:邻接列表和嵌套集.
你选择了邻接集,这也是我通常也会做的.尽管可以在单个查询中以正确的顺序检索嵌套集模型,但它比嵌套集模型更容易更改.邻接列表不能.您需要构建一个中间数据结构(树),然后将其转换为列表.
我会做什么(事实上最近做过)是:
在按父ID排序的一个查询中选择整个菜单内容;
使用关联数组或类/对象构建菜单结构的树;
走这棵树来创建嵌套的无序列表; 和
使用像Superfish这样的jQuery插件将该列表转换为菜单.
你建立这样的东西:
$menu = array( array( 'name' => 'Home', 'url' => '/home', ), array( 'name' => 'Account', 'url' => '/account', 'children' => array( 'name' => 'Profile', 'url' => '/account/profile', ), ), // etc );
并将其转换为:
用于生成菜单数组的PHP相当简单,但有点难以解决.您使用递归树行走函数来构建HTML嵌套列表标记,但将其实现作为读者的练习.:)
处理数据结构时,通常会涉及递归或多个查询来构建树.
您是否考虑过存储层次结构的其他方法?查看修改后的预订遍历 - 这是一篇很好的基于PHP的文章.