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 程序员的调试技术小结
Nov 15 PHP
php 字符串替换的方法
Jan 10 PHP
php中session退出登陆问题
Feb 27 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
Laravel 5框架学习之数据库迁移(Migrations)
Apr 08 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 PHP
php制作简单模版引擎
Apr 07 PHP
php打包压缩文件之ZipArchive方法用法分析
Apr 30 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
May 15 PHP
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
Apr 01 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批量删除数据
2007/01/18 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
php实现的顺序线性表示例
2019/05/04 PHP
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
Python3安装Pymongo详细步骤
2017/05/26 Python
Python 中Pickle库的使用详解
2018/02/24 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
python selenium firefox使用详解
2019/02/26 Python
python实现计算器功能
2019/10/31 Python
Python实现word2Vec model过程解析
2019/12/16 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
什么是测试驱动开发(TDD)
2012/02/15 面试题
企业党员一句话承诺
2014/05/30 职场文书
物业公司的岗位任命书
2014/06/06 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
初中差生评语
2014/12/29 职场文书
亮剑精神观后感
2015/06/05 职场文书
大学生见习总结报告
2015/06/24 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python