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 FPDF类库应用实现代码
Mar 20 PHP
PHP file_get_contents 函数超时的几种解决方法
Jul 30 PHP
一步一步学习PHP(5) 类和对象
Feb 16 PHP
php设计模式 Facade(外观模式)
Jun 26 PHP
PHP 输出URL的快捷方式示例代码
Sep 22 PHP
一个php生成16位随机数的代码(两种方法)
Sep 16 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
Dec 17 PHP
CodeIgniter钩子用法实例详解
Jan 20 PHP
静态html文件执行php语句的方法(推荐)
Nov 21 PHP
PHP实现查询手机归属地的方法详解
Apr 28 PHP
PHP+Session防止表单重复提交的解决方法
Apr 09 PHP
PHP simplexml_import_dom()函数讲解
Feb 03 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
星际争霸中的对战模式介绍
2020/03/04 星际争霸
php流量统计功能的实现代码
2012/09/29 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
密码强度检测效果实现原理与代码
2013/01/04 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
[05:24]TI9采访——教练
2019/08/24 DOTA
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
Python单元和文档测试实例详解
2019/04/11 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
Python list和str互转的实现示例
2020/11/16 Python
python爬取招聘要求等信息实例
2020/11/20 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
linux面试题参考答案(4)
2014/09/21 面试题
安全事故检讨书
2014/01/18 职场文书
服装设计师求职信
2014/06/04 职场文书
交通志愿者活动总结
2014/06/27 职场文书
大学生个人求职信例文
2014/07/07 职场文书
Python采集股票数据并制作可视化柱状图
2022/04/04 Python