从数组列表创建数组树
我有一个像这样的列表:
array(
array(id=>100, parentid=>0, name=>'a'),
array(id=>101, parentid=>100, name=>'a'),
array(id=>102, parentid=>101, name=>'a'),
array(id=>103, parentid=>101, name=>'a'),
)
但是更大,所以我需要一种有效的方法将其变成像这样的树状结构:
array(
id=>100, parentid=>0, name=>'a', children=>array(
id=>101, parentid=>100, name=>'a', children=>array(
id=>102, parentid=>101, name=>'a',
id=>103, parentid=>101, name=>'a',
)
)
)
我不能使用嵌套集之类的东西或类似的东西,因为我可以在数据库中添加左右值。 有什么想法吗?
i have a list like this:
array(
array(id=>100, parentid=>0, name=>'a'),
array(id=>101, parentid=>100, name=>'a'),
array(id=>102, parentid=>101, name=>'a'),
array(id=>103, parentid=>101, name=>'a'),
)
but way bigger so i need a efficient way to make this into a tree like structure like this:
array(
id=>100, parentid=>0, name=>'a', children=>array(
id=>101, parentid=>100, name=>'a', children=>array(
id=>102, parentid=>101, name=>'a',
id=>103, parentid=>101, name=>'a',
)
)
)
i cannot use things like nested set or things like that becoas i can add left and right values in my database.
any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
好吧,这就是我解决它的方法:
oke this is how i solved it:
如果您需要超过 1 个parentid[0] 元素,请进行小修复:)
small fix if you need more than 1 parentid[0] element :)
Thunderstriker 的变体的又一重做 - 所有逻辑都在一个函数中:
Playground:https://www.tehplayground.com/Ap4uUuwHWl9eiJIx
One more rework of Thunderstriker's variant - all the logic in one function:
Playground: https://www.tehplayground.com/Ap4uUuwHWl9eiJIx
这是我对亚瑟的重做的改编:
使用:
Here is my adaptation from arthur's rework:
Use:
我创建了一个不寻常的(“基于 while ”而不是递归)但多维排序函数,它遍历数组直到没有任何孤儿。这里的函数:
建议:数组中每个元素的键必须是元素本身的 id。示例:
用法:该函数需要$a(数组)、$parent_key(保存父亲id的列名)、$children_key(保存孩子id的列名)将会移动)。它什么也不返回(数组通过引用更改)。例子:
I created an unusual ('while-based' instead of recursive) but multidimensional sorting function that walk the array until there aren't any orphans. Here the function:
Recommendation: the key of each element of the array has to be the id fo the element itself. Example:
Usage: the function need $a (the array), $parent_key (the name of the column where the id of the father is saved), $children_key (the name of the column where the children will be move). It returns nothing (the array is changed by reference). Example:
实现此目的的一种方法是使用递归函数,该函数首先查找列表的所有底部值,并将它们添加到新数组中。然后,对于每个新 id,您对该 id 使用相同的函数,获取返回的数组并将其填充到该项目的新子数组中。最后,返回新数组。
我不会为你做所有的工作,但函数的参数看起来像这样:
function recursiveChildren($items_array, $parent_id = 0)
本质上,它会找到所有父级为 0 的参数,然后对于每个参数它会找到所有以该 id 作为父级的 id,并且对于每个 id ......依此类推。
最终结果应该是您正在寻找的。
One way to do this is with a recursive function that first finds all the bottom values of the list, adding them to a new array. Then for each new id, you use the same function on that id, taking the returned array and stuffing it in that item's new children array. Finally, you return your new array.
I won't do all the work for you, but the function's parameters will look something like:
function recursiveChildren($items_array, $parent_id = 0)
Essentially, it'll find all the ones with parent of 0, then for each of those it'll find all the ones with that id as the parent, and for each of those.. so on.
The end result should be what you are looking for.
这三遍方法有什么原因不起作用吗?我没有做任何测试来比较某些递归解决方案的速度,但它似乎更直接。如果您的初始数组已经与作为键的 ID 关联,那么您可以跳过第一个
foreach()
。Is there any reason this three pass method wouldn't work? I didn't do any tests to compare speed to some of the recursive solutions, but it seemed more straight forward. If your initial array is already associative with the IDs being the key, then you can skip the first
foreach()
.一个更简单的版本:
A simpler version: