PHP 类别和子类别的树结构,无需循环查询
我正在尝试创建一个包含任意数量子类别的类别列表,其中子类别也可以有自己的子类别。
我已经从 Mysql 数据库中选择了所有类别,猫位于标准关联数组列表中,每个类别都有一个 id、名称、parentid,其中如果是顶级,则parentid 为 0。
我基本上希望能够采用单级猫数组并将其转换为多维数组结构,其中每个类别都可以有一个包含子猫数组的元素。
现在,我可以通过循环查询每个类别来轻松实现此目的,但这远非理想,我试图在不对数据库造成任何额外点击的情况下实现这一目标。
我知道我需要一个递归函数。谁能为我指出这种树形结构的正确方向?
干杯
I'm trying to create a list of categories with any number of sub categories, where sub categories can also has their own sub categories.
I have selected all categories from the Mysql db, the cats are in a standard associate array list, each category has an id, name, parentid where the parentid is 0 if it's top level.
I basically want to be able to take the single level array of cats and turn it into a multidimensional array structure where each category can have an element which will contain an array of subcats.
Now, I can easily achieve this by looping a query for each category but this is far from ideal, I'm trying to do it without any extra hits on the db.
I understand I need a recursive function for this. Can anyone point me in the right direction for this tree style structure?
Cheers
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这完成了工作:
首先通过parent_id 对类别进行索引。然后对于每个类别,我们只需将
category->childs
设置为childs[category->id]
,树就构建好了!所以,现在
$tree
是类别树。它包含一个包含parent_id = 0的项目的数组,这些项目本身包含一个其子项的数组,这些子项本身......print_r($tree)
的输出:所以这是最终的函数:
Here is the same version, with arrays, which is a little tricky as we need to play with references (but works equally well):
所以数组最终函数的版本:
This does the job:
This works by first indexing categories by parent_id. Then for each category, we just have to set
category->childs
tochilds[category->id]
, and the tree is built !So, now
$tree
is the categories tree. It contains an array of items with parent_id=0, which themselves contain an array of their childs, which themselves ...Output of
print_r($tree)
:So here is the final function:
Here is the same version, with arrays, which is a little tricky as we need to play with references (but works equally well):
So the array version of the final function:
您可以一次获取所有类别。
假设您有来自数据库的平面结果,如下所示:
您可以创建一个简单的函数,将该平面列表转换为结构,最好在函数内部。我使用按引用传递,以便每个类别只有一个数组,而不是一个类别的数组的多个副本。
地图用于快速查找类别。在这里,我还为“根”级别创建了一个虚拟数组。
我向每个类别数组添加了另一个字段(子类别),并将其添加到地图中。
再次循环遍历每个类别,将其自身添加到其父类别的子类别列表中。 这里的引用很重要,否则当子类别较多时,已经添加的类别将不会更新。
最后,返回该虚拟类别的子类别,该虚拟类别引用所有顶级类别。_
用法:
这是 键盘。
You can fetch all categories at once.
Suppose you have a flat result from the database, like this:
You can create a simple function that turns that flat list into a structure, preferably inside a function. I use pass-by-reference so that there are only one array per category and not multiple copies of the array for one category.
A map is used to lookup categories quickly. Here, I also created a dummy array for the "root" level.
I added another field, subcategories, to each category array, and add it to the map.
Looping through each categories again, adding itself to its parent's subcategory list. The reference is important here, otherwise the categories already added will not be updated when there are more subcategories.
Finally, return the subcategories of that dummy category which refer to all top level categories._
Usage:
And here is the code in action on Codepad.
参见方法:
See the method :
我遇到了同样的问题,并以这种方式解决了它:从数据库中获取猫行,并为每个根类别构建树,从级别(深度)0开始。可能不是最有效的解决方案,但对我有用。
附注我知道OP正在寻找一种没有数据库查询的解决方案,但是这个解决方案涉及递归,并且将帮助任何偶然发现此问题的人寻找此类问题的递归解决方案并且不介意数据库查询。
I had the same problem and solved it this way: fetch cat rows from DB and for each root categories, build tree, starting with level (depth) 0. May not be the most efficient solution, but works for me.
ps. I am aware that OP is looking for a solution without DB queries, but this one involves recursion and will help anybody who stumbled across this question searching for recursive solution for this type of question and does not mind DB queries.