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

理解错误请指出

原文地址:https://www.cnblogs.com/zzw555/p/10223654.html