【发布时间】:2020-05-12 15:19:02
【问题描述】:
我有一个文件夹数组,每个文件夹都有一个唯一的 ID 和一个父 ID。我想要做的是从父级找到所有子文件夹,即使子文件夹是子文件夹或子文件夹(无限)。我只需要一个包含所有这些 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 = [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;
}
但我的问题是,我怎样才能使这个恢复?
【问题讨论】:
-
为什么要递归?您似乎已经有了最佳解决方案。添加递归仅意味着如果您的数组足够长并增加函数调用开销,您可能会破坏堆栈。如果要查找子子子节点,则当前算法将失败,您需要重复循环输入,直到您的开放集为空。那么问题是结构是扁平的,所以如果你想要高效的递归查找,你需要先将结构转换为树。
-
因为它需要递归,否则它只会得到第一个直接的孩子?
-
不一定。你也可以使用循环来做到这一点。
-
数组不能保证完美排序,因为它是通过 API 获得的(我无法控制)。所以一棵树听起来是一个很好的解决方案,我之前也尝试过,但是,我没有取得太大的成功,因为我不确定实现这一目标的最佳方法。
-
我相信该结构只会真正深入 4-5 层,初始平面阵列包含 30-50 个文件夹。所以我们不是在谈论巨大的数字,但它确实需要是无限的,如果这种情况在未来发生变化。
标签: php arrays recursion tree children