yii框架无限极分类的做法

用yii框架做了一个无限极分类,主要的数组转换都是粘贴的别人的代码,但还是不要脸的写出来,方便以后自己看

用的是递归,不是path路径

控制器:

protected function subtree($arr,$id=0,$lev=1){
        $subs = array(); // 子孙数组
        foreach($arr as $v) {
            if($v[‘parent_id‘] == $id) {
                $v[‘lev‘] = $lev;
                $subs[] = $v; // 举例说找到array(‘id‘=>1,‘name‘=>‘安徽‘,‘parent‘=>0),
                $subs = array_merge($subs,$this->subtree($arr,$v[‘cat_id‘],$lev+1));
            }
        }
        return $subs;
    }

public function actionCreate()
    {
        $model = new EcsCategory();
        $query = new \yii\db\Query();
        $query->select(‘*‘)
            ->from(‘ecs_category‘);
        $command = $query->createCommand();
        $res=$command->queryAll();
        $tree = $this->subtree($res,0,1);
        foreach($tree as $k=> $v) {
            $tree[$k][‘new_cat_name‘]=str_repeat(‘--‘,$v[‘lev‘]).$v[‘cat_name‘].str_repeat(‘--‘,$v[‘lev‘]);  //str_repeat — 重复一个字符串
        }
        $arr=array(
            ‘new_cat_name‘=>‘顶级分类‘,
            ‘cat_id‘=>0
        );
        array_unshift($tree,$arr);
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect([‘view‘, ‘id‘ => $model->cat_id]);
        } else {
            return $this->render(‘create‘, [
                ‘model‘ => $model,
                ‘data‘=>$tree,
            ]);
        }
    }

视图:

 use \yii\helpers\ArrayHelper;

<?= $form->field($model, ‘parent_id‘)->dropDownList(ArrayHelper::map($data,‘cat_id‘,‘new_cat_name‘) ,[‘prompt‘ => ‘请选择父级分类‘]) ?>
时间: 2025-01-09 04:51:34

yii框架无限极分类的做法的相关文章

谈一次php无限极分类的案例

作者:白狼 出处:http://www.manks.top/php_tree_deep.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.原文有图片. 平时开发中或多或少不可避免会遇到无限极分类的问题,因为效率.逻辑等问题也一直使这类问题比较尖锐.今天我们以yii2框架为基础,栏目无限极为例,对这个问题进行一个简单的处理. 首先我们有一张栏目数据表 tree 表结构如下图(原文有图) 看上去表结构很简单. 我们插入几

PHP实现无限极分类的两种方式

无限极分类说简单点就是一个类可以分成一个分子类,然后一个子类又可以分另一个子类这样无限分下去,就是好象windows可以新建一个文件夹,然后在这个文件夹里又可以建一个文件夹,PHP要实现无限极分类有两种常用的做法,递归和引用算法. 数据表(两种实现方式都是一样的数据表): 建数据表的时候,增加一个字段(一般用pid作为字段名)用来区别自己所属的分类,字段值为其父级的主键id,0为一级分类. 1.引用算法: (1)获取一级分类 获取pid为0的数据,返回给模板,循环展示. 循环展示新增id属性,其

PHP实现无限极分类的两种方式,递归和引用

面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类 $array = array( array('id' => 1, 'pid' => 0, 'name' => '河北省'), array('id' => 2, 'pid' => 0, 'name' => '北京市'), array('id' => 3, 'pid' => 1, 'name' => '邯郸市'), array('id' =>

夺命雷公狗ThinkPHP项目之----企业网站8之栏目的添加完善(无限极分类的完成)

我们刚才只是完成了添加的一部分,但是我们的上级分类也不能永远都是只有一个死的嘛,所以我们需要对她进行修改: 我们先将add方法里面的数据查出来再说: 然后在模板页进行遍历: 展示效果如下所示: 虽然是出现了,但是没有向我们平常时候见到的无限极分类一样噢,一般比如分类 多多,分类下面的 好多美女啊 是多多的下级分类,那么好多美女啊他前面是有几个空格之类的隔开, 那么我们就需要在model层里面对她进行排序的设置了: <?php namespace Admin\Model; use Think\Mo

PHP无限极分类

概述 ??在实际工作中,经常要用到无限极分类.如导航表等等.到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱,代码很多,那些都不靠谱,还是自己捣鼓捣鼓无限极分类了.下面介绍两种无限极分类:递归,使用引用 数据准备 //初始化原始数据(id=>编号,name=>显示名称,pid=>父级目录id,sort=>排序顺序) $data[1] = array('id'=>'1','name'=>'一级目录A','pid'=>'0','sort'=>'1

php递归无限极分类

递归无限级分类有几种形式,我这里只举例比较常用的三种: 第一种:返回有排序的数组: <?php $data = array( 1 => array( 'id' => 1, 'pid' => 0, 'user_name' => 'one', ), 2 => array( 'id' => 2, 'pid' => 1, 'user_name' => 'two', ), 3 => array( 'id' => 3, 'pid' => 1, '

递归与无限极分类

在函数内部调用本身,且在调用时要做判断. 例:输出1~9 function deeploop(&$i=1){   //引用传值,防止递归时从1开始 echo  $i; $i++; if($i < 10){             //条件判断,防止无限递归 deeploop($i); } } 2.无限极分类原理:每次分类都需要记录它的父级id,如果是顶级,则父级id为0,通过父级id,一层一层往下查. 首先从数据库中取出结果集,把结果集中的pid与顶级的pid开始,然后确定顶级父级.依次往下

C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Caching 我理解是在内容中实现,这种方法适用于单服务器的生产环境. 2.a Distributed Cache 分部式缓存实现. 3.Response Cache 这种方式我理解为客户端缓存. 今天我只用了第一种实现方法,内存中缓存,之所以用这种方法我是觉得我这里用缓存的初衷是为了减少访问数据库的次数,

递归的一些应用(二)无限极分类

用递归的方法实现无限极分类 通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类 第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下, (1)建表: -- ---------------------------- -- Table structure for pid -- ----------------------------