PHP/MySQL-建立一个导航菜单的层次结构
题
因此最后的菜单上会看起来像这样的东西:
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
我怎么会去显示? 我猜是这只涉及储存的所有物品进入一个多层面阵列,然后循环,通过它在某种程度上...
解决方案
与所述数据结构处理你有它通常会涉及递归或多个查询来构建树。
你有没有考虑存储层次结构的其他方式?看看修改前序遍历 - 这里是关于这个一个不错的基于PHP的文章。
其他提示
分级数据是有点烦人在relationsal数据库(不包括Oracle,其中有运营商 START WITH/CONNECT BY
处理此)。基本上有 两个模型:邻接表和嵌套套。
你已经选择邻接关系的设置,这是我通常也这样做。它远远更容易改变比嵌套的模式,尽管嵌套的模式可以检索以正确的顺序在一个单一的查询。邻接列出是不可能的。你会需要建立一个中间数据结构的(树),然后将其转换成一个清单。
我会怎么做(以及已经做了最近在实际上)是:
- 选择整个菜单的内容在一个查询下令由父母身份证;
- 建立一个树的菜单结构,使用联阵或课程/对象;
- 走,树创造嵌套的无序清单;和
- 使用一个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产生的菜单列从相当简单,但有一点finnicky到解决。你利用递归树-行走功能,建立HTML嵌套清单的标记,但是将把它的执行作为一个运动对于读者。:)
您的存储分层数据是效率不高,你可能会想要的方式。我 MySQL的管理层次数据一个几年前读条并已发现以来它作为的最好在SQL管理基于分层数据的解决方案。下一个最好的好处是,我相信你可以抓住整个树与一个查询。
我只是张贴在一个类似的问题我自己的方法来改造MySQL的分层数据(邻接表)进入菜单(HTML)
它确实的不使用递归。并且它需要一个的单个查询以数据库中。
更多详情
https://stackoverflow.com/questions/2871861#3368622
感谢。
您可以生成层次,如果你不想使用嵌套组的另一种简单的方法是使用前一个简单的文本字符串。
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
在每个项目前的数字可以被存储在一个领域,并且分析基于长度(代表它是深度)来告诉你,你需要知道通向哪里的一切。
我使用的要求计算,电子TC更复杂的东西组嵌套层次结构,但我觉得这种做法很好服务