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

Mat*_*att 4 php mysql arrays menu hierarchy

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

Item B
    Item B-1
        Item B-1-2
        Item B-1-1
Item A
    SubItem A-1
    SubItem A-2
Item C
Run Code Online (Sandbox Code Playgroud)

基于以下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
Run Code Online (Sandbox Code Playgroud)

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

cle*_*tus 8

在关系数据库(不包括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
);
Run Code Online (Sandbox Code Playgroud)

并将其转换为:

<ul class="menu">;
  <li><a href="/">Home</a></li>
  <li><a href="/account">Account Services</a>
    <ul>
      <li><a href="/account/profile">Profile</a></li>
...
Run Code Online (Sandbox Code Playgroud)

用于生成菜单数组的PHP相当简单,但有点难以解决.您使用递归树行走函数来构建HTML嵌套列表标记,但将其实现作为读者的练习.:)


Pau*_*xon 7

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

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