分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

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

发布时间:2023-09-06 02:28责任编辑:蔡小小关键词:PHP

实现商品无限分类

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

理解错误请指出

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

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved