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 字符串正则替换函数preg_replace使用说明
Jul 15 PHP
PHP中session变量的销毁
Feb 27 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
php实现中文转数字
Feb 18 PHP
php实现图片上传并利用ImageMagick生成缩略图
Mar 14 PHP
理解php依赖注入和控制反转
May 11 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
Jul 23 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
Aug 15 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
实现PHP中session存储及删除变量
Oct 15 PHP
PHP与Web页面的交互示例详解一
Aug 04 PHP
PHP内存溢出优化代码详解
Feb 26 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
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
JQuery选择器、过滤器大整理
2015/05/26 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
对类Vue的MVVM前端库的实现代码
2018/09/07 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
Python制作exe文件简单流程
2019/01/24 Python
Python的历史与优缺点整理
2020/05/26 Python
Puccini乌克兰:购买行李箱、女士手袋网上商店
2020/08/06 全球购物
机械系毕业生求职信
2014/05/28 职场文书
学校安全管理责任书
2014/07/23 职场文书
小学元宵节活动总结
2015/02/06 职场文书
承诺书范本大全
2015/05/04 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
机关工会工作总结2015
2015/05/26 职场文书
舞出我人生观后感
2015/06/16 职场文书
校园新闻稿范文
2015/07/18 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js