从单个 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');

待传入。