我试图编写一个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像这样订购?或者,我可以通过其他方式实现吗?
对不起,如果我的问题有点令人困惑。
答案 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]
开始递归打印。