php无限极分类 在tp框架中的改良问题

漫步的猪 2016-11-03 09:27:49
由于经常使用在项目中使用无限极分类,所以封装成了一个类tree

其中查找id下所有子分类的函数如下: $arr为无限极整体的数组,$pid_name为父id数据库的字段名,$id为要查找的id值.

static public function unlimited_child($arr,$pid_name,$id=0){

$tmp=array();

foreach ($arr as $v) {

if($v["$pid_name"]==$id){

$tmp[]=$v['id'];

// $tmp[]=$v;

$tmp=array_merge($tmp,self::unlimited_child($arr,$pid_name,$v['id']));

}

}

return $tmp;
}

调用方法:
//获取无限极分类的数据
$cateM=M('category');
$cateAll=$cateM->select();

//获得某个id下面的子分类,
$cid=Tree2::unlimited_child('$cateAll','parent_id',$id);

我用的是tp3.2的框架,每次都需要先调用红色的取一下数据,为了简化代码适应tp3.2,我改良后的类Tree2: $tablename为无限极栏目存放的表名,其他参数不变

static public function unlimited_child($tablename,$pid_name,$id=0){

$arr=M($tablename)->select();

// dump($arr);

$tmp=array();

foreach ($arr as $v) {

if($v["$pid_name"]==$id){

$tmp[]=$v['id'];

// $tmp[]=$v;

$tmp=array_merge($tmp,self::unlimited_child($tablename,$pid_name,$v['id']));

}

}

return $tmp;
}

调用方法:

$cid=Tree2::unlimited_child('category','parent_id',$id);

但是取回来的是空,函数里// dump($arr);这块能取到数据,哪块出问题了,应该怎么写,谢谢
...全文
1062 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-11-04
  • 打赏
  • 举报
回复
你 M($tablename)->select() 就是取出表 $tablename 的全部数据(比如 1 万条数据) 然后 if($v["$pid_name"]==$id){ ,但满足条件的可能不止一个,现就假定就一个 如果有十层,你不就是在 10 万条数据中抽取 10 条吗? 为实际做树形查找时,是要在数据库查询时加筛选条件的,以使每次处理的数据量减少(当然出错的可能也减少了) 至于为什么你没有得到数据,那就是你检查的不仔细了(这个别人帮不上忙,因为没有你的环境) 再说方案就是不可取的,再去抠代码也是没有意义的
漫步的猪 2016-11-04
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
tp 有个 Relation 模型,就是干这个的 $arr=M($tablename)->select(); foreach ($arr as $v) { 在递归中做这样的操作,你不觉得是件很恐怖的事情吗?
我函数里加了 $arr=M($tablename)->select();这个的,打印也能取到数据,为什么返回的是空,这两个唯一的区别,就是一个数据时在函数外面取,一个集成到函数内部去,为啥会得到空,不理解. 在模型读取数据时做一个判断,保证第一次取一次就行了吧.放递归里也没啥不妥吧 还有一个问题我dump的时候为啥只执行了一次,不是递归一次就执行一次吗?
xuzuning 2016-11-04
  • 打赏
  • 举报
回复
tp 有个 Relation 模型,就是干这个的 $arr=M($tablename)->select(); foreach ($arr as $v) { 在递归中做这样的操作,你不觉得是件很恐怖的事情吗?

4,249

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧