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即父类idcateid即主键idkey则是作为数组的下标所以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

时间: 2024-10-09 13:19:20

PHP Yii2.0 框架实现无限级分类的相关文章

yii2.0框架安装心得

yii2.0安装心得 能够搜索到这篇文章的朋友相信是对yii框架有兴趣的,但是我不得不吐槽的是,这个安装过程确实让人头疼,接下来就让大家见证一下这个纠结的过程 根据官网的说法,安装这个框架需要用到composer,没有办法拉,先去大概的了解一下这个composer吧 什么是composer 根据composer的官网,它是这样解释的:composer是php用来管理依赖关系的工具,搞的这么复杂,直接说就是一个比较智能的下载工具不就好了.比如说我的项目是依赖yii框架的,而yii是依赖于其他东西的

yii2.0 框架 载入 PHPExcel 类

我用的是composer 安装的, 自己引入的话找了好多的方法但是都不能引入 所以找了这个简单一点的. composer require "phpoffice/phpexcel"    用这个命令下载就可以(等一会时间),前提是你已经安装的composer 如果没有,就安装一个,就不多说了. 安装完成后 window 下打开命令窗口 输入compposer 查看是否安装成功,然后打开你的yii2.0(高级版)框架的verdor 这个文件夹 Shift+右键,打开命令窗口,运行上面那个下

学习yii2.0框架(一)

Yii 是什么 Yii 是一个高性能,基于组件的 PHP 框架,用于快速开发现代 Web 应用程序.名字 Yii (读作 易)在中文里有“极致简单与不断演变”两重含义,也可看作 Yes It Is! 的缩写. Yii 最适合做什么? Yii 是一个通用的 Web 编程框架,即可以用于开发各种用 PHP 构建的 Web 应用.因为基于组件的框架结构和设计精巧的缓存支持,它特别适合开发大型应用,如门户网站.社区.内容管理系统(CMS).电子商务项目和 RESTful Web 服务等. 系统要求 Yi

YII2.0框架——环境搭建

一.YII  简单介绍 1.网站 Yii Framework 官方地址:http://www.yiiframework.com Yii Framework 官方仓库:https://github.com/yiisoft Yii Framework 中文社区地址:http://www.yiichina.com Yii Framework 中文社区仓库:https://github.com/yiichina Yii Framework 中文图书:http://www.yiibook.com 2.Yi

Yii2.0框架Restfull API开发攻略

1.将Yii2.0 advanced版中应用主体frontend 或 backend 应用复制为api应用 2.在应用主体api目录的controller新建SiteController.php: namespace api\controllers; use Yii; use yii\rest\ActiveController;/*SiteController测试控制器 */class SiteController extends ActiveController{public $modelCl

学习yii2.0框架阅读代码(十一)

vendor/yiisoft/yii2/base/Module. php(续) /** * 该方法解析指定的路线和创建相应的子模块(s),控制器和行动 * This method parses the specified route and creates the corresponding child module(s), controller and action * instances. It then calls [[Controller::runAction()]] to run th

学习yii2.0框架阅读代码(七)

vendor/yiisoft/yii2/base/Model.php <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\base; use Yii; use ArrayAccess; use ArrayObject; use A

学习yii2.0框架阅读代码(四)

阅读 BaseYii Yii的辅助类核心框架 别名相关(续) //用一个真实的路径注册一个别名 public static function setAlias($alias, $path) { if (strncmp($alias, '@', 1)) { // 如果不是以 @ 开头,就将 @ 拼到开头 $alias = '@' . $alias; } // 获取 / 在 $alias 中首次出现的位置 $pos = strpos($alias, '/'); // 如果 / 不存在,$root 就

学习yii2.0框架阅读代码(二十)

vendor/yiisoft/yii2/base/Module. php(续) /** * 新建一个控制器实例基于给定的路线. * * 路线应该是相对于这个模块.该方法实现了以下算法 * to resolve the given route: * * 1. If the route is empty, use [[defaultRoute]]; * 2. If the first segment of the route is a valid module ID as declared in [