【发布时间】:2022-02-10 17:27:37
【问题描述】:
我正在尝试将数组重新格式化为树,主数组和子数组应按“名称”属性分组。
我的平面数组是这样的
$flat = [
['id' => 1, 'parent_id' => 0, 'name' => 'root1'],
['id' => 2, 'parent_id' => 0, 'name' => 'root1'],
['id' => 3, 'parent_id' => 1, 'name' => 'ch-1'],
['id' => 4, 'parent_id' => 1, 'name' => 'ch-1'],
['id' => 5, 'parent_id' => 3, 'name' => 'ch-1-1'],
['id' => 6, 'parent_id' => 3, 'name' => 'ch-1-1'],
['id' => 7, 'parent_id' => 0, 'name' => 'root2'],
['id' => 8, 'parent_id' => 0, 'name' => 'root2'],
['id' => 9, 'parent_id' => 7, 'name' => 'ch3-1'],
['id' => 10, 'parent_id' => 7, 'name' => 'ch3-1']
];
我可以通过
构建树结构$tree = buildTree($flat, 'parent_id', 'id');
function buildTree(array $flatList)
{
$grouped = [];
foreach ($flatList as $node) {
$grouped[$node['parent_id']][] = $node;
}
$fnBuilder = function ($siblings) use (&$fnBuilder, $grouped) {
foreach ($siblings as $k => $sibling) {
$id = $sibling['id'];
if (isset($grouped[$id])) {
$sibling['children'] = $fnBuilder($grouped[$id]);
}
$siblings[$k] = $sibling;
}
return $siblings;
};
return $fnBuilder($grouped[0]);
}
这很好用。
但我想要的是构建嵌套数组应该按它的“名称”属性分组。
所以最终的输出应该是这样的
[
"root1": [{
"id": 1,
"parent_id": 0,
"name": "root1",
"children": [
"ch-1": [{
"id": 3,
"parent_id": 1,
"name": "ch-1",
"children": [
"ch-1-1": [{
"id": 5,
"parent_id": 3,
"name": "ch-1-1"
},
{
"id": 6,
"parent_id": 3,
"name": "ch-1-1"
}
]
]
},
{
"id": 4,
"parent_id": 1,
"name": "ch-1"
}
]
]
},
{
"id": 2,
"parent_id": 0,
"name": "root1"
}
],
"root2": [{
"id": 7,
"parent_id": 0,
"name": "root2",
"children": [
"ch3-1": [{
"id": 9,
"parent_id": 7,
"name": "ch3-1"
},
{
"id": 10,
"parent_id": 7,
"name": "ch3-2"
}
]
]
},
{
"id": 8,
"parent_id": 0,
"name": "root2"
}
]
]
我几乎被困在这里几天了。请帮我解决这个问题。 谢谢。
【问题讨论】:
-
有没有可能同名不同的parent_id?
-
No.. 不能有同名但不同的parent_id。
-
这能回答你的问题吗? Build a tree from a flat array in PHP
-
我可以构建树形数组,但问题是格式化的数组应该被分组。
标签: php arrays multidimensional-array