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 相关文章推荐
在WIN98下以apache模块方式安装php
Oct 09 PHP
PHP的简易冒泡法代码分享
Aug 28 PHP
php 无法加载mcrypt.dll的解决办法
Apr 03 PHP
smarty自定义函数htmlcheckboxes用法实例
Jan 22 PHP
如何使用php实现评委评分器
Jul 31 PHP
PHP翻页跳转功能实现方法
Nov 30 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
Dec 14 PHP
php获取linux命令结果的实例
Mar 13 PHP
漂亮的thinkphp 跳转页封装示例
Oct 16 PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 PHP
PHP7 其他修改
Mar 09 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学习笔记 (1) 环境配置与代码调试
2011/06/19 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
详解VueJs异步动态加载块
2017/03/09 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
详解Angular2响应式表单
2017/06/14 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
2017/07/26 Javascript
详解使用vuex进行菜单管理
2017/12/21 Javascript
微信小程序网络层封装的实现(promise, 登录锁)
2019/05/08 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
python修改txt文件中的某一项方法
2018/12/29 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
python通过http下载文件的方法详解
2019/07/26 Python
Python可以用来做什么
2020/11/23 Python
Python实现简单的2048小游戏
2021/03/01 Python
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
初中教师个人总结
2015/02/10 职场文书
公司放假通知怎么写
2015/04/15 职场文书
刑事申诉状范文
2015/05/20 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android