三级分类递归操作(通用方法)

浏览:6501 发布日期:2016/03/25 分类:功能实现 关键字: 递归 三级分类
无论是商城前台还是后台总是有分类的递归操作是最常用的方法
在某个Model里面建立以下函数,方便在Controller里面直接调用,这种方法适用于最多三级分类,其实无限极分类现在的项目很少用到。class MenuModel extends Model {
    /**
     * 取分类列表,最多为三级
     * @param int $show_deep 显示深度
     * @param array $condition 检索条件
     * @return array 数组类型的返回结果
     */
    public function getTreeClassList($show_deep='3',$condition=array()){
        //获取所有的分类
        $class_list = $this->getGoodsClassList($condition);
        // p($class_list);die;
        $goods_class = array();//分类数组
        if(is_array($class_list) && !empty($class_list)) {
            $show_deep = intval($show_deep);
            if ($show_deep == 1){//只显示第一级时用循环给分类加上深度deep号码
                foreach ($class_list as $val) {
                    if($val['parent_id'] == 0) {
                        $val['deep'] = 1;
                        $goods_class[] = $val;
                    } else {
                        break;//父类编号不为0时退出循环
                    }
                }
            } else {//显示第二和三级时用递归
                $goods_class = $this->_getTreeClassList($show_deep,$class_list);
            }
        }
        return $goods_class;
    }
     /**
     * 所有分类列表
     * @param  array   $condition  检索条件
     * @return array   返回二位数组
     */
    public function getGoodsClassList($condition, $field = '*') {
        $result = $this->field($field)->where($condition)->order('parent_id asc,sort asc,id asc')->select();
        return $result;
    }
    /**
     * 递归 整理分类
     *
     * @param int $show_deep 显示深度
     * @param array $class_list 类别内容集合
     * @param int $deep 深度
     * @param int $parent_id 父类编号
     * @param int $i 上次循环编号
     * @return array $show_class 返回数组形式的查询结果
     */
    private function _getTreeClassList($show_deep,$class_list,$deep=1,$parent_id=0,$i=0){
        static $show_class = array();//树状的平行数组
        if(is_array($class_list) && !empty($class_list)) {
            $size = count($class_list);
            if($i == 0) $show_class = array();//从0开始时清空数组,防止多次调用后出现重复
            for ($i;$i < $size;$i++) {//$i为上次循环到的分类编号,避免重新从第一条开始
                $val = $class_list[$i];
                $gc_id = $val['id'];
                $gc_parent_id    = $val['parent_id'];
                if($gc_parent_id == $parent_id) {
                    $val['deep'] = $deep;
                    $show_class[] = $val;
                    if($deep < $show_deep && $deep < 3) {//本次深度小于显示深度时执行,避免取出的数据无用
                        $this->_getTreeClassList($show_deep,$class_list,$deep+1,$gc_id,$i+1);
                    }
                }
                if($gc_parent_id > $parent_id) break;//当前分类的父编号大于本次递归的时退出循环
            }
        }
        return $show_class;
    }
}
然后在控制器里面直接调用public function index(){
    $parent_list =D('Menu')->getTreeClassList(3);
    //在模板中输出层级关系
    $gc_list = array();
    if (is_array($parent_list)){
    foreach ($parent_list as $k => $v){
        $parent_list[$k]['name'] = str_repeat(" ",$v['deep']*2).$v['name'];
            if($v['deep'] == 1) $gc_list[$k] = $v;
    }
    }
}
评论( 相关
后面还有条评论,点击查看>>