如何递归求出从根节点出发的每一条分支线上的所有节点(有先后顺序,除去返回父节点的节点)
kel 2006-09-08 11:53:51 假设有一个节点关系数组如下:
$allnode = array
(
'0' => array
(
'from' => 3349,
'to' => 3350
),
'1' => array
(
'from' => 3349,
'to' => 3352
),
'2' => array
(
'from' => 3350,
'to' => 3622
),
'3' => array
(
'from' => 3351,
'to' => 3623
),
'4' => array
(
'from' => 3352,
'to' => 3628
),
'5' => array
(
'from' => 3353,
'to' => 3631
),
'6' => array
(
'from' => 3354,
'to' => 3355
),
'7' => array
(
'from' => 3355,
'to' => 3356
),
'8' => array
(
'from' => 3622,
'to' => 3350
),
'9' => array
(
'from' => 3622,
'to' => 3351
),
'10' => array
(
'from' => 3622,
'to' => 4346
),
'11' => array
(
'from' => 3623,
'to' => 3351
),
'12' => array
(
'from' => 3623,
'to' => 3352
),
'13' => array
(
'from' => 3628,
'to' => 3352
),
'14' => array
(
'from' => 3628,
'to' => 3353
),
'15' => array
(
'from' => 3631,
'to' => 3353
),
'16' => array
(
'from' => 3631,
'to' => 3354
),
'17' => array
(
'from' => 4346,
'to' => 4347
),
'18' => array
(
'from' => 4347,
'to' => 3352
),
'19' => array
(
'from' => 4347,
'to' => 4346
)
);
$node_rows = array();
$node_from = array();
$flow_branch = array();//每一条分支上的节点
$first_id = 3349;//起始节点
function getBranch($next_id){
global $node_rows,$node_from,$allnode;
array_push($node_from, $next_id);
foreach($allnode as $key1=>$arr){
if($arr['from'] == $next_id){
if(!in_array($arr['to'],$node_from)){
array_push($node_rows,$arr['to']);
getBranch($arr['to']);
}
}
}
return $node_rows;
}
foreach($allnode as $key2=>$arr2){
if($first_id == $arr2['from']){
$node_rows = array($first_id,$arr2['to']);
$node_from = array();
$next_row = getBranch($arr2['to']);
if(!in_array($next_row,$flow_branch)){
$flow_branch[] = $next_row;
}
}
}
print_r($flow_branch);
这样只求出了从起点分叉的分支节点,没求出从中间分叉的节点。