我在php中有一个包含 id 和 parent_id 的对象的数组。 没有parent_id的所有对象应该是新数组中的根对象。
执行所有具有parent_id的对象应该被推送到正确的Object的子数组中:
所以这是我原来的数组:
array
0 =>
object(Node)[528]
protected 'id' => int 1
protected 'parent_id' => null
1 =>
object(Node)[529]
protected 'id' => int 2
protected 'parent_id' => null
2 =>
object(Node)[530]
protected 'id' => int 3
protected 'parent_id' => 1
3 =>
object(Node)[531]
protected 'id' => int 4
protected 'parent_id' => 1
4 =>
object(Node)[532]
protected 'id' => int 5
protected 'parent_id' => 4
5 =>
object(Node)[533]
protected 'id' => int 6
protected 'parent_id' => 4
这就是新数组的样子:
$nodes = array(
array(
'id' => 1,
'parent_id' => null,
'children' => array(
array(
'id' => 3,
'parent_id' => 1,
'children' => null
),
array(
'id' => 4,
'parent_id' => 1,
'children' => array(
array(
'id' => 5,
'parent_id' => 4
),
array(
'id' => 6,
'parent_id' => 5
),
)
),
),
),
array(
'id' => 2,
'parent_id' => null,
'children' => null
),
);
任何想法我怎么能这样做?
答案 0 :(得分:5)
尝试这样的事情:
// collects all nodes that belong to a certain parent id
function findChildren($nodeList, $parentId = null) {
$nodes = array();
foreach ($nodeList as $node) {
if ($node['parent_id'] == $parentId) {
$node['children'] = findChildren($nodeList, $node['id']);
$nodes[] = $node;
}
}
return $nodes;
}
像这样使用:
$nestedNodes = findChildren($nodeList);
此代码以递归方式搜索原始parent_id
中的给定$nodeList
。如果找到匹配的节点,它将搜索此节点的子节点,依此类推。如果找不到给定parent_id
的子项,则会重新调整空数组。
您可以使用$nodeList
的引用来减少此方法的内存使用量。