使用递归实现树状菜单(无限级分类)

本期概要:
使用递归实现无限级菜单分类
复制代码

一、数据结构 一般情况下,我们的数据表常规设计如下:

idnamepid
1PHP 技术0
2Linux 技术0
3PHP 基础1
4PHP 高级1
5PHP 数据类型3
6PHP 数据类型 - 字符串5
7Linux 基础2
8Linux 简单命令7

当我们从数据库中查询出数据,得到二维数组结构如下:

[
	[
		"id": 1,
		"name": "PHP 技术",
		"pid": 0
	],
	[
		"id": 3,
		"name": "PHP 基础",
		"pid": 1
	],
	[
		"id": 5,
		"name": "PHP 数据类型",
		"pid": 3
	],
	[
		"id": 6,
		"name": "PHP 数据类型 - 字符串",
		"pid": 5
	],
	[
		"id": 4,
		"name": "PHP 高级",
		"pid": 1
	],
	[
		"id": 2,
		"name": "Linux 技术",
		"pid": 0
	],
	[
		"id": 7,
		"name": "Linux 基础",
		"pid": 2
	],
	[
		"id": 8,
		"name": "Linux 简单命令",
		"pid": 7
	]
]
复制代码

我们要实现无限级菜单,主要核心思路就是: 找出每个菜单所在的层级(level)
那么我们就需要用到递归,得出每个菜单对应的层级

function _infinite($_data, $_pid = 0, $_level = 0) {
    // 定义静态变量,防止每次都初始化
    static $_new_data = [];
    
    // 循环,得出每个数据对应的层级
    foreach ($_data as $_key => $_value) {
        // 第一次遍历,找到父节点为根节点的节点,即:pid = 0
        if ($_value['pid'] == $_pid) {
            // 当该节点为根节点时,对应的层级设为 0,即:level = 0
            $_value['level'] = $_level;
            // 把该节点放入数组中
            $_new_data[] = $_value;
            // 得出节点层级后,删除该节点,减少递归的消耗
            unset($_data[$_key]);
            // 开始递归,查找所有 pid 为当前节点 id 的数据,层级加 1,作为对应的子节点
            _infinite($_data, $_value['id'], $_level + 1);
        }
    }

    // 返回带层级的新数组
    return $_new_data;
}
复制代码

调用方法,我们可以得到新数组:

[
	[
		"id": 1,
		"name": "PHP 技术",
		"pid": 0,
		"level": 0
	],
	[
		"id": 3,
		"name": "PHP 基础",
		"pid": 1,
		"level": 1
	],
	[
		"id": 5,
		"name": "PHP 数据类型",
		"pid": 3,
		"level": 2
	],
	[
		"id": 6,
		"name": "PHP 数据类型 - 字符串",
		"pid": 5,
		"level": 3
	],
	[
		"id": 4,
		"name": "PHP 高级",
		"pid": 1,
		"level": 1
	],
	[
		"id": 2,
		"name": "Linux 技术",
		"pid": 0,
		"level": 0
	],
	[
		"id": 7,
		"name": "Linux 基础",
		"pid": 2,
		"level": 1
	],
	[
		"id": 8,
		"name": "Linux 简单命令",
		"pid": 7,
		"level": 2
	]
]
复制代码

我们得到新数据以后,需要将数据根据需要的 view 展示出来,我这里使用树形结构打印:

function _show_tree($_data) {
    $_html = '';
    foreach ($_data as $_key => $_value) {
        if ($_value['level'] > 0) {
            $_prefix = '|' . str_repeat('--', $_value['level']);
        } else {
            $_prefix = '';
        }

        $_html .= $_prefix . '<a href="###">' . $_value['name'] . '</a><br />';
    }

    return $_html;
}
复制代码

得到效果图如下:

这样我们就完成了使用递归实现无限级分类的效果。

转载于:https://juejin.im/post/5c6bb9a56fb9a049e413452f

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值