• thinkphp实现无限级分类


    普通的方法(采用for和foreach)

    		//显示
            foreach($data as $k=>$v){
            //str_repeat()函数用于把字符串重复指定的次数
                $data[$k]['title']=str_repeat('---',$v['type']-1).$v['title'];
            }
    

    无限级分类的设计思路:
    为了能够使得栏目的管理更加动态化,在这里可以设置添加栏目,添加的数据库中设计一个名为pid的字段,便于新添加的栏目可以找到他的父栏目。如果是顶级的栏目,则pid为0。再提取数据显示的时候,后台数据库中设置有type字段,用于标识该栏目的等级,在数据显示的时候用str_repeat()函数在前面加上‘-----’,来区分他们的等级。
    这个时候的排序显得非常的重要,并且此方法没办法很好的把父级和子级联系在一起,不建议使用

    排序

    添加的时候为了更加方便的直观的显示哪个栏目下有什么子栏目,可以选择在里面设置一个sorts排序字段,用于排序。在前端,为了能够方便排序。需要表单提交全部的排序的内容。前端的话只需要在表单input的name属性里加入一个数组名

    <input type="hidden" name="id[]" value="{$arr.id}"/>
    <input type="text" value="{$arr.sorts}" style=" 40px;height: 40px;text-align: center" name="sorts[]"/>
    

    然后后台进行接受,同样用for和foreach进行循环操作和遍历

    		//把新的获得的排序的信息储存到数据库中
            $arr=$_POST;
            for($i=0;$i<count($arr['id']);$i++){
                $sort=$model->find($arr['id'][$i]);
                $sort['sorts']=$arr['sorts'][$i];
                $model->save($sort);
            }
            //然后根据新的排序信息进行排序
            $data=$model->order('sorts')->select();
            foreach($data as $k=>$v){
                $data[$k]['title']=str_repeat('---',$v['type']-1).$v['title'];
            }
    
    
    

    用递归的方法实现无限级分类


    public function getCate($field='*'){
    	//用field查询固定字段的数据,若是没有输入实参,则默认查询全部
    	//获取到数据库中相关栏目的数据
    	$data=$this->field($field)->order('sorts asc')->select();
    	//调用递归函数
    	return $this->getTree($data);
    }
    
    //根据父级栏目的id去查询子栏目的信息
    //递归函数,传入全部的栏目信息,用pid来标识栏目所对应的父级的栏目id,level来表示栏目的等级
    public function getTree($data,$pid=0,$level=0){
    	//此处应该定义static 如果没有用static,则无法输出全部的栏目信息
    	static $tree=array();
    	foreach($data as $key=>$v){
    		if($v['pid']==$pid){
    			$v['level']=$level;
    			//str_repeat()函数用于把字符串重复指定的次数,用于区别栏目的等级
    			$v['title']=str_repeat('----',$level).$v['title'];
    			$tree[]=$v;
    			$this->getTree($data,$v['id'],$level+1);
    		}
    	}
    }
    
    

    在用递归函数进行无限级分类的时候建议写在model函数里,这样在控制器中只需要调用模型中的方法即可。再模型中要想调用数据库的查询操作,不用加表明,只需要在模型中使用$this即可。

  • 相关阅读:
    C++获取时间函数
    平滑算法:三次样条插值(Cubic Spline Interpolation)
    为什么想要交谈?
    c++日常小问题
    看板娘
    世界碰撞算法原理和总结(sat gjk)
    转载c++默认初始化文章--google翻译
    从4行代码看右值引用(转载 《程序员》2015年1月刊)
    c++模板特例化 函数模板(非法使用显式模板参数 )
    InverseTransformPoint 函数问题
  • 原文地址:https://www.cnblogs.com/wtyhome/p/7289850.html
Copyright © 2020-2023  润新知