mysql / php中的多级菜单

时间:2016-05-21 10:04:55

标签: php mysql sql-order-by

我试图编写一个PHP代码,可以获取多级菜单,深度不受限制。我希望能够只使用一个查询和一个循环来完成它。 这就是我所拥有的: 我有一个menu_items表,其中包含以下列:

id 
categories_id (overall menu id)
title (Text title)
link (Link)
ord (the order within the category itself)
parent (Parent item, which is basically another item, different from categories_id)
depth (Menu level. For whatever reason, I think it's going to help me to know the depth of every particular item)

所有菜单项都通过categories_id链接到特定菜单,并且所有菜单项都通过" parent"链接到其父项目。顶级项目的父级为0。

现在,我需要mysql以这样的方式返回整个项目列表(在相同的categories_id下),循环的一次传递将能够在一个漂亮的多维数组中组织它们。

我该怎么做? 我想做的一种方法是,如果我能让MySQL以这样的方式订购物品,那么每件物品都会由它的所有孩子继续进行。

例如: 如果我有这个结构:

Item 1
Item 2
     Item 3
     Item 4
        Item 5
     Item 6
Item 7
Item 8

如果项目1,7和8是顶级空项目,则项目2有三个子项目,子项目4项目5为其子项目

我需要mysql以这种方式订购上述项目: 项目1,然后项目2,然后因为项目2有孩子,它应该输出项目3和4,因为4有一个孩子,它应该按项目5进行,然后它回到项目6 ......等....

有没有办法让MySQL像这样订购?或者,我可以通过其他方式实现吗?

对不起,如果我的问题有点令人困惑。

1 个答案:

答案 0 :(得分:1)

如果你想用一个查询加载所有东西,那么有意义的是因为你很可能在菜单中没有数千个项目,那么你可以简化你的任务并用PHP做更多的事情而不是过度复杂的SQL查询。

首先,您只需使用最简单的查询加载所有内容:

$items = query('SELECT * FROM `menu_items` WHERE categories_id = ? ORDER BY `ord` asc');

这样,在将所有项目分成子菜单后,将保留订单。然后你只需要一个循环来构建菜单结构。

$itemsById = [];
$children = [];
foreach ($items as $item) {
    $itemsById[$item['id']] = $item;
    $children[$item['parent']][] = $item['id'];
}

您可以从$children[0]开始递归打印。