我有一个由外部系统以以下格式返回的数组的php数组
$elements = [
[
'id' => 1,
'name' => 'Element 1',
'parent_id' => 0
],
[
'id' => 2,
'name' => 'Element 2',
'parent_id' => 0
],
[
'id' => 3,
'name' => 'Element 3',
'parent_id' => 1
],
[
'id' => 4,
'name' => 'Element 4',
'parent_id' => 1
],
[
'id' => 5,
'name' => 'Element 5',
'parent_id' => 1
],
[
'id' => 6,
'name' => 'Element 6',
'parent_id' => 2
],
[
'id' => 7,
'name' => 'Element 7',
'parent_id' => 2
],
[
'id' => 8,
'name' => 'Element 8',
'parent_id' => 3
],
[
'id' => 9,
'name' => 'Element 9',
'parent_id' => 3
],
[
'id' => 10,
'name' => 'Element 10',
'parent_id' => 3
]
];
如果有帮助,这种“翻译”成树的结构看起来像这样:
我现在需要做的是:对于给定的ID列表,返回具有提供的ID及其子元素的所有元素(无论有多少级)。例如,如果我收到一个带有[2, 3]
的数组,则输出应为[2, 3, 7, 8, 9, 10]
。
我创建了一个函数来基于数组生成树结构:
public function createTree($parent = 0)
{
// This returns all the direct children of $parent
$elements = filterByParent($parent);
$categories = [];
$i = 0;
foreach ($elements as $element) {
$categories[$i] = $element;
$categories[$i]['children'] = createTree($element['id']);
$i++;
}
return $categories;
}
但是我现在不知道该怎么做。
任何帮助将不胜感激。
谢谢!
答案 0 :(得分:1)
我已经更改了方法,因为从单个递归方法创建列表非常容易。它还会传入$elements
,以便可以轻松对其进行测试。
该方法可以采用一个ID或ID的数组,如果它是单个ID,则将其设为一个数组,以便可以foreach()
遍历列表。然后,它仅针对每个元素进行检查,并将其添加到工作列表中。然后调用相同的方法查找其他子项。
function dependants ( $ids, $elements ) {
if ( !is_array($ids) ) {
$ids = [$ids];
}
$deps = $ids;
foreach ( $ids as $id ) {
foreach ( $elements as $element ) {
if ( $element['parent_id'] == $id ) {
$deps = array_merge($deps, dependants($element['id'], $elements));
}
}
}
return $deps;
}
print_r(dependants([2,3], $elements ));
给予
Array
(
[0] => 2
[1] => 3
[2] => 6
[3] => 7
[4] => 8
[5] => 9
[6] => 10
)