我在php中有一个包含ID和parent_id的对象数组.
所有没有parent_id的对象都应该是新数组中的根对象.
所有确实具有parent_id的对象应被推入正确的对象的子代数组中:
这是我的原始数组:
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
),
);
知道我该怎么做吗?
解决方法:
尝试这样的事情:
// 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);
此代码以递归方式在原始$nodeList中搜索给定的parent_id.如果找到匹配的节点,它将搜索该节点的子节点,依此类推.如果找不到给定parent_id的子代,则重新调整一个空数组.
您可以通过使用$nodeList的引用来减少此方法的内存使用量.
标签:php,arrays,multidimensional-array
来源: https://codeday.me/bug/20191013/1904787.html