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数据缓存技术
Feb 14 PHP
php下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
Feb 22 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
PHP使用range协议实现输出文件断点续传代码实例
Jul 04 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
Sep 22 PHP
thinkphp判断访客为手机端或PC端的方法
Nov 24 PHP
php批量添加数据与批量更新数据的实现方法
Dec 16 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 PHP
php/JS实现的生成随机密码(验证码)功能示例
Jun 06 PHP
laravel 多图上传及图片的存储例子
Oct 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
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
javascript 写类方式之四
2009/07/05 Javascript
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
2011/07/26 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
2015/10/30 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
jQuery动态移除和添加背景图片的方法详解
2017/03/07 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
ES6 十大特性简介
2020/12/09 Javascript
python改变日志(logging)存放位置的示例
2014/03/27 Python
Python中AND、OR的一个使用小技巧
2015/02/18 Python
python编程线性回归代码示例
2017/12/07 Python
Python socket实现简单聊天室
2018/04/01 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
python取均匀不重复的随机数方式
2019/11/27 Python
python能否java成为主流语言吗
2020/06/22 Python
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
怎么处理XML的中文问题
2015/03/26 面试题
学前班学生评语
2014/12/29 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
python中super()函数的理解与基本使用
2021/08/30 Python
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python