当前位置:  开发笔记 > 编程语言 > 正文

PHP/MySQL - 构建导航菜单层次结构

如何解决《PHP/MySQL-构建导航菜单层次结构》经验,为你挑选了2个好方法。

所以最终菜单看起来像这样:

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

我该怎么去展示?我的猜测是它将涉及将所有项目存储到一个多维数组中,然后以某种方式循环遍历它...



1> cletus..:

在关系数据库(不包括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嵌套列表标记,但将其实现作为读者的练习.:)



2> Paul Dixon..:

处理数据结构时,通常会涉及递归或多个查询来构建树.

您是否考虑过存储层次结构的其他方法?查看修改后的预订遍历 - 这是一篇很好的基于PHP的文章.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有