• PHP Yii2.0 框架实现无限级分类


    实现商品无限分类

    mysql:

    很简单的数据库设计,就能完成分类的无限级

    效果预览:

    主要方法:

    1.首先获取所有的分类

    获取分类数据库里所有的数据

    //获取所有的分类
        public function getData()
        {
           return ArrayHelper::toArray(self::find()->all());
        }

    2.其次将分类按照parentid父类ID分类后放进数组(也就是排序)

    //按照父类id 排序
        public function getTree($cates, $pid = 0)
        {
            $tree = [];
            foreach($cates as $cate) {
                if ($cate['parentid'] == $pid) {//第一层先获取顶级分类
                    $tree[] = $cate;
                    //第二层将顶级分类放进数组,然后再次调用方法,获取当前id下的分类
                    $tree = array_merge($tree, $this->getTree($cates, $cate['cateid']));
                }
            }
            return $tree;
        }

    cates: 获取的所有分类

    pid: 父类ID

    定义空数组

    --循环所有分类

    --默认父类ID为0即获取当前指针的顶级分类

    --放入数组

    --将当前下标的id作为父类ID再次循环查询,即查询到子类

    --放入数组,直至当前指针循环结束

    --next

    排序完成

    3.按照parentid 父类ID划分为几级分类  前面加几个|---- 组成数组

    //按照parentid 前面加几个|----- 组成数组
        public function setPrefix($data, $p = "|-----")
        {
            $tree = [];
            $num = 1;//2  num遇到一次加级别就加一,加同级别的就从prefix中直接拿
            $prefix = [0 => 1];
            //当前指针
            //current函数返回当前被内部指针指向的数组元素的值,并不移动指针。
            while($val = current($data)) {
    
    //            0 { ["cateid"]=> string(1) "1" ["title"]=> string(12) "电子产品" ["parentid"]=> string(1) "0" ["createtime"]=> string(10) "1546587373" }
    //            1 { ["cateid"]=> string(1) "2" ["title"]=> string(12) "电子产品" ["parentid"]=> string(1) "1" ["createtime"]=> string(10) "1546587373" }
    
                //key() 函数从当前内部指针位置返回元素键名
                $key = key($data);//1
                //0 数组下标比id小一
                if ($key > 0) {//不是第一个
    
    //上一个的父类id不等于当前的父类id,
    //                pid: 0  0  2  2  4  4  1
    //                key: 0  1  2  3  4  5  6
    //和上级相比 ,父类id一致的就说明是同级,不一致的说明是下级
                    if ($data[$key - 1]['parentid'] != $val['parentid']) {
                        $num ++;//2   //3  //
                        }
                }
    
                //true
                //存在就说明 之前有这个同级分类,直接获得num,不存在就说明他是新创的 那就是二级分类,直接加一就好
                if (array_key_exists($val['parentid'], $prefix)) {
                    $num = $prefix[$val['parentid']];
                    //1
                }
    
                //把字符串 $p 重复 $num 次:
                $val['title'] = str_repeat($p, $num).$val['title'];
                $prefix[$val['parentid']] = $num;
    //            0下面的就是一个num,2下面的就是2个num,记录至这个数组中
    //            $prefix[0=>1, 2=>2, 4=>3, 1=>2]
                $tree[] = $val;
                next($data);
            }
            return $tree;
        }

    data:已经排序好的数组

    p:分类标识 |----

    num: 几个 p

    prefix: 已经有的分类信息,key:父类id   value:几个p, 默认0=>1 就是顶级分类 一个p ,那就是    |----顶级分类名

    在理解这个方法的时候,我举了好几个数字,一个个从头到尾思考

                 pid:    0  0  2  2  4  4  1
    cateid: 1 2 3 4 5 6 7
    key: 0 1 2 3 4 5 6

    pid即父类id
    cateid即主键id
    key则是作为数组的下标
    所以key比cateid小一
    pid等于几那就是对于cateid 是谁的子类
    pid等于零的那就是顶级分类

    --获取当前指针值
    --获取当前指针键
    --key不大于0 就是0 即顶级分类,直接进prefix 拿到num为0
    --key大于0 非顶级分类
    --将当前父类id和上一个cateid的父类id相比是否一致
    --不一致则代表,他是新的一级分类,则num++
    --在prexfix记录 父类id 对应 num数量
    --一致则代表,这两个分类有相同的父类,则直接到prefix中找 对应num
    --next


    拼接完成

    public function getOptions()
    {
        $data = $this->getData();
        $tree = $this->getTree($data);
        $tree = $this->setPrefix($tree);
        $options = ['添加顶级分类'];
        foreach($tree as $cate) {
            $options[$cate['cateid']] = $cate['title'];
        }
        return $options;
    }
    
    
    

     学习自 https://coding.imooc.com/class/57.html

    理解错误请指出

  • 相关阅读:
    线程
    简单排序
    SSM的整合
    SpringMVC中的拦截器、异常处理器
    SpringMVC的文件上传
    SpringMVC的数据响应和结果视图
    springMVC的常用注解
    SpringMVC入门
    Spring中声明式事务控制
    JdbcTemplate在spring中的使用
  • 原文地址:https://www.cnblogs.com/zzw555/p/10223654.html
Copyright © 2020-2023  润新知