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 和 MySQL 基础教程(二)
Oct 09 PHP
在Windows版的PHP中使用ADO
Oct 09 PHP
使用PHP静态变量当缓存的方法
Nov 13 PHP
php异常处理方法实例汇总
Jun 24 PHP
基于thinkPHP实现的微信自定义分享功能示例
Sep 23 PHP
注释PHP和html混合代码的小技巧(分享)
Nov 03 PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
Feb 17 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
Mar 24 PHP
PHP 实现从数据库导出到.csv文件方法
Jul 06 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 PHP
PHP手机号码及邮箱正则表达式实例解析
Jul 11 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设计聊天室步步通
2006/10/09 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
ThinkPHP函数详解之M方法和R方法
2015/09/10 PHP
zen cart实现订单中增加paypal中预留电话的方法
2016/07/12 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
jquery 日期分离成年月日的代码
2010/05/14 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
jquery操作复选框checkbox的方法汇总
2015/02/05 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
Python实现豆瓣图片下载的方法
2015/05/25 Python
Django验证码的生成与使用示例
2017/05/20 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
python中可以声明变量类型吗
2020/06/18 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
房产公证书
2015/01/23 职场文书
债务追讨律师函
2015/06/24 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
高中英语教学反思范文
2016/03/02 职场文书
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python