实现商品无限分类
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
理解错误请指出