21,886
社区成员
发帖
与我相关
我的任务
分享
function subtree($arr,$parent){
$subs = array();
$task = array($parent);
while(!empty($task)){
$flag = false; //$flag初始化为假
foreach($arr as $k=>$v){
if($v['parent'] == $parent){
$subs[] = $v;
$parent = $v['id'];
array_push($task,$v['id']);
unset($arr[$k]); //为什么此处要用unset??????
$flag = true; //找到子栏目
}
}
if($flag == false){
array_pop($task);
$parent = end($task);
}
print_r($task);
}
return $subs;
}
$ar = array(
array('id' => 1, 'parent'] =>0),
array('id' => 2, 'parent'] =>1),
array('id' => 3, 'parent'] =>1),
);
subtree($ar, 1);
id=1 的节点有 id=2 和 id=3 的两个子节点
当找到 id=2 的节点后,如果不删去的话,下一轮查找就又会找到 id=2 的节点
从而出现死循环,显然这个 unset($arr[$k]); 是不得已而为之的,因为这个算法的思路有问题(他采用的是 深度优先算法,应该还有优化的余地)
而 广度优先算法 就要简单多了
function subtree($arr,$parent){
$subs = array();
$task = array($parent);
for($i=0;$i<count($task); $i++){
$parent = $task[$i];
foreach($arr as $k=>$v){
if($v['parent'] == $parent){
$subs[] = $v;
if(! in_array($v['id'], $task)) $task[] = $v['id'];
}
}
}
return $subs;
}