首先,我返回一个数组出来。
id,uid,title
递归是用uid来区分的
例如:
iduidtitle
10首页
21新闻
31产品
那么问题来了,我在网上找了一个递归树型的类。一直用得挺好。今天发现一个问题。请高手帮我解决一下。
就是这个类在处理递归的时候。他是按照ID顺序来的
比如:
id=1uid=0
id=2uid=1
id=3uid=2
id=4uid=0
它是这样递归下去的。如果我返回的数组不是按ID排序的。这个类就无法递归了
比如我把id=2移动到Id=4下面去
就会返回
id=1uid=0
id=4uid=0
id=2uid=4
之后不管有多少uid=2的子分类都不会在显示了。不知道我这么表答清楚吗。谢谢大家。
classTree{
private$result;
private$tmp;
private$arr;
private$already=array();
/**
*构造函数
*
*@paramarray$result树型数据表结果集
*@paramarray$fields树型数据表字段,array(分类id,父id)
*@paraminteger$root顶级分类的父id
*/
publicfunction__construct($result,$fields=array('id','uid'),$root=0){
$this->result=$result;
$this->fields=$fields;
$this->root=$root;
$this->handler();
}
/**
*树型数据表结果集处理
*/
privatefunctionhandler(){
foreach($this->resultas$node){
$tmp[$node[$this->fields[1]]][]=$node;
}
@krsort($tmp);
for($i=count($tmp);$i>0;$i--){
foreach($tmpas$k=>$v){
if(!in_array($k,$this->already)){
if(!$this->tmp){
$this->tmp=array($k,$v);
$this->already[]=$k;
continue;
}else{
foreach($vas$key=>$value){
if($value[$this->fields[0]]==$this->tmp[0]){
$tmp[$k][$key]['child']=$this->tmp[1];
$this->tmp=array($k,$tmp[$k]);
}
}
}
}
}
$this->tmp=null;
}
$this->tmp=$tmp;
}
/**
*递归
*/
privatefunctionrecur($arr,$id){
foreach($arras$v){
if($v[$this->fields[0]]==$id){
$this->arr[]=$v;
if($v[$this->fields[1]]!=$this->root)$this->recur($arr,$v['uid']);
}
}
}
/**
*菜单多维数组
*
*@paraminteger$id分类id
*@returnarray返回分支,默认返回整个树
*/
publicfunctionleaf($id=null){
$id=($id==null)?$this->root:$id;
return$this->tmp[$id];
}
/**
*导航一维数组
*
*@paraminteger$id分类id
*@returnarray返回单线分类直到顶级分类
*/
publicfunctionnavi($id){
$this->recur($this->result,$id);
krsort($this->arr);
return$this->arr;
}
}
$op=newTree(我的数组);
$arr=$op->leaf();
我返回的数组决对没有问题的
分 -->
|