从单个 parent 递归获取所有 children
Recursively obtain all children from a single parent
我有一组文件夹,每个文件夹都有一个唯一的 ID 和一个 parent ID。我想要做的是从 parent 中找到所有 children 文件夹,即使 child 是 sub-sub-folder 或子 [=25] =](无限)。我只需要一个包含所有这些 ID 的数组。
例如,如果我有以下数组
$folders = [
[
'id' => 1,
'parent' => null
],
[
'id' => 2,
'parent' => null
],
[
'id' => 3,
'parent' => 1
],
[
'id' => 4,
'parent' => 3
],
[
'id' => 5,
'parent' => 4
],
[
'id' => 6,
'parent' => 1
]
];
如果我想获取文件夹 ID 1 的所有 children,需要能够循环并得到以下响应:
$children = [3,4,5,6];
我试过以下方法:
public function getChildrenIds($folders, $parent_id)
{
$folderIds = [];
foreach($folders as $folder) {
if($folder['parent'] == $parent_id) {
$folderIds[] = $folder['id'];
}
}
return $folderIds;
}
但我的问题是,我怎样才能使这个递归?
您可以扩展检查以检查目前找到的所有父节点(使用 in_array()
。这使它成为一次性检查..
,而不是使其递归
public function getChildrenIds($folders, $parent_id)
{
// Prime array with parent looking for
$folderIds = [$parent_id];
foreach($folders as $folder) {
// Check if matches any parent so far found
if( in_array($folder['parent'], $folderIds) ) {
$folderIds[] = $folder['id'];
}
}
// Remove parent id added at start
array_shift($folderIds);
return $folderIds;
}
这个版本确实使用了递归,它首先将数组排列为仅以id为键,以id为值(使用array_column()
)。
然后当它将每个父项与 id 相匹配时,它会将其添加到列表中,然后调用自身以添加任何子项...
public function getChildrenIds($hierarchy, $parent_id)
{
$folderIds = [];
foreach ( $hierarchy as $id => $folder ) {
if ( $folder == $parent_id ) {
$folderIds[] = $id;
$folderIds = array_merge($folderIds, getChildrenIds($hierarchy, $id));
}
}
return $folderIds;
}
忘记补充说数组文件夹应该使用...
$hierarchy = array_column($folders, 'parent', 'id');
待传入。
我有一组文件夹,每个文件夹都有一个唯一的 ID 和一个 parent ID。我想要做的是从 parent 中找到所有 children 文件夹,即使 child 是 sub-sub-folder 或子 [=25] =](无限)。我只需要一个包含所有这些 ID 的数组。
例如,如果我有以下数组
$folders = [
[
'id' => 1,
'parent' => null
],
[
'id' => 2,
'parent' => null
],
[
'id' => 3,
'parent' => 1
],
[
'id' => 4,
'parent' => 3
],
[
'id' => 5,
'parent' => 4
],
[
'id' => 6,
'parent' => 1
]
];
如果我想获取文件夹 ID 1 的所有 children,需要能够循环并得到以下响应:
$children = [3,4,5,6];
我试过以下方法:
public function getChildrenIds($folders, $parent_id)
{
$folderIds = [];
foreach($folders as $folder) {
if($folder['parent'] == $parent_id) {
$folderIds[] = $folder['id'];
}
}
return $folderIds;
}
但我的问题是,我怎样才能使这个递归?
您可以扩展检查以检查目前找到的所有父节点(使用 in_array()
。这使它成为一次性检查..
public function getChildrenIds($folders, $parent_id)
{
// Prime array with parent looking for
$folderIds = [$parent_id];
foreach($folders as $folder) {
// Check if matches any parent so far found
if( in_array($folder['parent'], $folderIds) ) {
$folderIds[] = $folder['id'];
}
}
// Remove parent id added at start
array_shift($folderIds);
return $folderIds;
}
这个版本确实使用了递归,它首先将数组排列为仅以id为键,以id为值(使用array_column()
)。
然后当它将每个父项与 id 相匹配时,它会将其添加到列表中,然后调用自身以添加任何子项...
public function getChildrenIds($hierarchy, $parent_id)
{
$folderIds = [];
foreach ( $hierarchy as $id => $folder ) {
if ( $folder == $parent_id ) {
$folderIds[] = $id;
$folderIds = array_merge($folderIds, getChildrenIds($hierarchy, $id));
}
}
return $folderIds;
}
忘记补充说数组文件夹应该使用...
$hierarchy = array_column($folders, 'parent', 'id');
待传入。