PHP无线分类,封装树状结构,并根据指定字段排序,可用于,RBAC权限控制

数据库结构

  • CREATE TABLE auth_menus (
    id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘序号’,
    path varchar(100) DEFAULT NULL COMMENT ‘菜单地址’,
    icon varchar(45) DEFAULT NULL COMMENT ‘图标’,
    name varchar(30) DEFAULT NULL COMMENT ‘菜单名称’,
    desc varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘备注’,
    parent_id int(11) DEFAULT ‘0’ COMMENT ‘父菜单编号,缺省0代表第一级’,
    order int(11) DEFAULT ‘0’ COMMENT ‘显示顺序’,
    status tinyint(1) DEFAULT ‘1’ COMMENT ‘状态:1 有效;0无效;’,
    contr_name varchar(255) DEFAULT NULL COMMENT ‘控制器名称’,
    ctime datetime DEFAULT NULL COMMENT ‘添加时间’,
    PRIMARY KEY (id) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8 COMMENT=‘菜单表’;

定义公共方法

    /**
     * @param $cate
     * @param string $name
     * @param int $pid
     * @return array
     * 封装菜单为多维数组并根据order字段排序
     */
    static Public function unlimitedForLayer($cate, $name = 'children', $pid = 0)
    {
    //定义空数组存储数据集
        $arr = array();
    //循环对数据进行封装
        foreach ($cate as $v) {
            if ($v['status'] == 1) {
            	//parent_id父菜单编号,缺省0代表第一级
                if ($v['parent_id'] == $pid) {
                //递归调用
                    $v[$name] = self::unlimitedForLayer($cate, $name, $v['id']);
                    $arr[] = $v;
                }
            }
        }
        //对封装好的数组根据某字段进行排序进
        foreach ($arr as $v) {
            if (count($v['children']) > 1) {
            //array_column 数组中的某列值 
            //array_multisort对多个数组或多维数组进行排序
                array_multisort(array_column($v['children'], 'order'), SORT_DESC, $v['children']);
            }
            array_multisort(array_column($arr, 'order'), SORT_DESC, $arr);

        }
        return $arr;
    }

控制器调用

 /**
     * 菜单列表
     * @ currentPage
     * @ pageSize
     */
    public function index()
    {
        $condition = array();
        $data = $this->AuthMenuModel->where($this->condition($condition))->select()->toArray();
        $data = $this->AuthMenuModel->unlimitedForLayer($data); 
        $this->responseIOT(array('code' => '1', 'errMsg' => 'SUCCESS', 'data' => $data));

    }

效果展示
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傅先生的傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值