4

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

Item B
    Item B-1
        Item B-1-2
        Item B-1-1
Item A
    SubItem A-1
    SubItem A-2
Item C

基于以下数据库记录:

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

我将如何进行展示?我的猜测是它将涉及将所有项目存储到一个多维数组中,然后以某种方式循环它......

4

5 回答 5

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
);

并将其转换为:

<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>
...

用于生成菜单数组的 PHP 相当简单,但解决起来有点困难。您使用递归树遍历函数来构建 HTML 嵌套列表标记,但会将其实现留作读者练习。:)

于 2009-01-25T15:16:28.557 回答
7

处理现有的数据结构通常会涉及递归或多个查询来构建树。

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

于 2009-01-25T15:16:48.990 回答
1

您存储分层数据的方式并不像您希望的那样有效。几年前,我阅读了在 MySQL 中管理层次结构数据的文章,并发现它是在 SQL 中管理基于层次结构的数据的最佳解决方案。下一个最大的好处是我相信你可以通过一个查询来获取整个树。

于 2009-01-25T16:02:27.947 回答
1

我刚刚在一个类似的问题中发布了我自己将 MySQL 分层数据(邻接列表)转换为菜单(HTML)的方法

它不使用递归。它需要对数据库进行一次查询

阅读更多

https://stackoverflow.com/questions/2871861#3368622

谢谢。

于 2010-07-30T04:23:24.550 回答
0

如果您不想使用嵌套集,则可以生成层次结构的另一种简单方法是在前面使用简单的文本字符串。

Item B
    Item B-1
        Item B-1-2
        Item B-1-1
Item A
    SubItem A-1
    SubItem A-2
Item C

会成为

1 Item B
  1.1 Item B1
    1.1.1 Item B11
    1.1.2 Item B12
2 Item A
  2.1 Item A1
  2.2 Item B2
3 Item C

每个项目前面的数字可以存储在一个字段中,并根据长度(表示它所在位置的深度)进行解析,以告诉您您需要了解的所有信息。

我将嵌套集层次结构用于需要计算的更复杂的东西,例如,但我发现这种方法效果很好

于 2009-01-25T16:51:17.897 回答