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 相关文章推荐
使用网络地址转换实现多服务器负载均衡
Oct 09 PHP
基于php冒泡排序算法的深入理解
Jun 09 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 PHP
完美实现wordpress禁止文章修订和自动保存的方法
Nov 03 PHP
简单实用的PHP防注入类实例
Dec 05 PHP
php实现smarty模板无限极分类的方法
Dec 07 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
Mar 20 PHP
php实现生成验证码实例分享
Apr 10 PHP
php实现当前页面点击下载文件的实例代码
Nov 16 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
PHP XML Expat解析器知识点总结
Feb 15 PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
javascript 触发事件列表 比较不错
2009/09/03 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
jquery插件hiAlert实现网页对话框美化
2015/05/03 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
Python简单进程锁代码实例
2015/04/27 Python
详解Python中的strftime()方法的使用
2015/05/22 Python
浅谈Python的异常处理
2016/06/19 Python
python实现Decorator模式实例代码
2018/02/09 Python
Django model反向关联名称的方法
2018/12/15 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
长青弘远的面试题
2012/06/09 面试题
施工安全协议书
2013/12/11 职场文书
远程培训的心得体会
2014/09/01 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
大学生见习总结报告
2015/06/24 职场文书
运动会100米加油稿
2015/07/21 职场文书
vue使用watch监听属性变化
2022/04/30 Vue.js
mysql sql常用语句大全
2022/06/21 MySQL