php菜单/评论数据递归分级算法的实现方法


Posted in PHP onAugust 01, 2019

在开发过程中经常会遇到分级场景,如菜单分级、评论、商品类型分级等;在同一张mysql数据表中可能设计单表结构,如同如下数据:

$menuList = [
  [ 'id' => 1,'parent_id' => 0, 'name' => '节点1'],
  [ 'id' => 2,'parent_id' => 1, 'name' => '节点1-1'],
  [ 'id' => 3,'parent_id' => 0, 'name' => '节点2'],
  [ 'id' => 4,'parent_id' => 3, 'name' => '节点2-1'],
  [ 'id' => 5,'parent_id' => 2, 'name' => '节点1-1-1'],
  [ 'id' => 6,'parent_id' => 1, 'name' => '节点1-2'],
 ];

这时候在处理展示过程就需要将上面的结构转换为更加直观的数据结构, 形如:

$treeList = [
 [
 children: [
  children: []
 ]
 ]
 [,
 children: [
  children: []
 ]
 ]
];

算法代码如下:

<?php

class Menu
{
 /**
  * 递归循环菜单列表, 转化为菜单树
  * @param $treeList 菜单树列表
  * @param $menuList 菜单列表
  * @return bool
  */
 public function getMenuTree(&$treeList, $menuList)
 {
  // 初始化顶级父节点
  if (! count($treeList)) {
   foreach($menuList as $index => $menu) {
    if ($menu['parent_id'] == 0) {
     $treeList[] = $menu;
     unset($menuList[$index]);
    }
   }
  }

  // 递归查找子节点
  foreach ($treeList as &$tree) {
   foreach ($menuList as $index => $menu) {
    if (empty($tree['children'])) {
     $tree['children'] = [];
    }
    if ($menu['parent_id'] == $tree['id']) {
     $tree['children'][] = $menu;
     unset($menuList[$index]);
    }
   }
   if (! empty($tree['children'])) {
    $this->getMenuTree($tree['children'], $menuList);
   } else {
    // 递归临界点
    return false;
   }
  }
 }

}

$menuList = [
 [ 'id' => 1,'parent_id' => 0, 'name' => '节点1'],
 [ 'id' => 2,'parent_id' => 1, 'name' => '节点1-1'],
 [ 'id' => 3,'parent_id' => 0, 'name' => '节点2'],
 [ 'id' => 4,'parent_id' => 3, 'name' => '节点2-1'],
 [ 'id' => 5,'parent_id' => 2, 'name' => '节点1-1-1'],
 [ 'id' => 6,'parent_id' => 1, 'name' => '节点1-2'],
];
$treeList = [];
(new Menu)->getMenuTree($treeList, $menuList);
print_r($treeList);

happy coding!

每一个不曾起舞的日子,都是对生命的辜负 ^-^

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php的控制语句
Oct 09 PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 PHP
使用php判断网页是否gzip压缩
Jun 25 PHP
PHP实现今天是星期几的几种写法
Sep 26 PHP
php中通过curl检测页面是否被百度收录
Sep 27 PHP
php截取中文字符串函数实例
Feb 23 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 PHP
php pdo连接数据库操作示例
Nov 18 PHP
laravel框架使用阿里云短信发送消息操作示例
Feb 15 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 #PHP
php curl发送请求实例方法
Aug 01 #PHP
php layui实现前端多图上传实例
Jul 30 #PHP
安装docker和docker-compose实例详解
Jul 30 #PHP
docker-compose部署php项目实例详解
Jul 30 #PHP
php 使用mpdf实现指定字段配置字体样式的方法
Jul 29 #PHP
laradock环境docker-compose操作详解
Jul 29 #PHP
You might like
配置最新的PHP加MYSQL服务器
2006/10/09 PHP
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
php学习笔记之基础知识
2014/11/08 PHP
两种php给图片加水印的实现代码
2020/04/18 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
DHTML Slide Show script图片轮换
2008/03/03 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
python 实现在txt指定行追加文本的方法
2018/04/29 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
详解Python用户登录接口的方法
2019/04/17 Python
Django 静态文件配置过程详解
2019/07/23 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
HTML5中使用postMessage实现Ajax跨域请求的方法
2016/04/19 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
三好学生自我鉴定
2013/12/17 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电