在处理无限级分类的场景下,经常需要不断寻找子节点,如果直接使用递归的话,代码很容易阅读,结构会很简洁,但是 由于递归是不停调用函数,所以每次调用会产生新的函数调用栈,比较占用资源
现在引入迭代模式替换递归
思想就是 引入队列的方式不断把下级节点引入到队列中循环处理,直到队列为空
function getAllChildren($id) {
// 初始化任务
$tasks = [$id];
// 存储所有后代元素
$data = [];
while ($tasks) {
// 直到没有任务才推出循环
foreach ($tasks as $v) {
$data[] = $v;
//存储元素
// 追加任务
$tasks = array_merge($tasks, getChildren($v['id']));
// 将头部任务移除 继续下一个任务
array_shift($tasks);
}
}
return $data;
}
function getChildren($pid) {
return fetch_all("SELECT * FROM xxx WHERE pid={$pid}");
}