关于PHP递归的问题。急求高手帮助解答

[复制链接]
查看11 | 回复4 | 2021-1-27 06:46:05 | 显示全部楼层 |阅读模式
首先,我返回一个数组出来。
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();
我返回的数组决对没有问题的
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:46:05 | 显示全部楼层
邻接列表的父子关系是由节点id和父节点id共同决定的,对你而言就是(id、uid)
若数据为数组,则并不需要递归(当然递归也可以)
你的代码使用了krsort函数,显然是不妥当的
因为不应该有子节点id一定要大于父节点id这样的假定
回复

使用道具 举报

千问 | 2021-1-27 06:46:05 | 显示全部楼层
引用1楼xuzuning的回复:邻接列表的父子关系是由节点id和父节点id共同决定的,对你而言就是(id、uid)
若数据为数组,则并不需要递归(当然递归也可以)
你的代码使用了krsort函数,显然是不妥当的
因为不应该有子节点id一定要大于父节点id这样的假定


那大哥,可否教我一下怎么改。或者帮我改一下呢。
这个类我是在网上找的
我只想按UID来指序。不想按ID正序排列
回复

使用道具 举报

千问 | 2021-1-27 06:46:05 | 显示全部楼层


回复

使用道具 举报

千问 | 2021-1-27 06:46:05 | 显示全部楼层
敢不敢有个自己的逻辑?网上的仅供参考你要结合你自己的情况呀,不能直接复制黏贴就完了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行