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 相关文章推荐
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
Dec 06 PHP
php中通过Ajax如何实现异步文件上传的代码实例
May 07 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
Linux下php5.4启动脚本
Aug 03 PHP
PHP 实现判断用户是否手机访问
Jan 21 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
Feb 26 PHP
Yii2设置默认控制器的两种方法
May 19 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
Jun 21 PHP
PHP addAttribute()函数讲解
Feb 03 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 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
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
php 魔术方法使用说明
2009/10/20 PHP
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
PHP 验证登陆类分享
2015/03/13 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
pandas如何处理缺失值
2019/07/31 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
Python读取实时数据流示例
2019/12/02 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
个人租房协议书
2014/04/09 职场文书
C++程序员求职信范文
2014/04/14 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
考研英语复习计划
2015/01/19 职场文书
工作一年自我鉴定
2019/06/20 职场文书
Django Paginator分页器的使用示例
2021/06/23 Python
德劲DE1102数字调谐收音机机评
2022/04/07 无线电
鸿蒙3.0体验感怎么样? 鸿蒙3.0系统评测向
2022/08/14 数码科技