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数据库非常慢的解决方法
Jul 05 PHP
php simplexmlElement操作xml的命名空间实现代码
Jan 04 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
Apr 30 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
Jul 02 PHP
跟我学Laravel之快速入门
Oct 15 PHP
php在数组中查找指定值的方法
Mar 17 PHP
php程序内部post数据的方法
Mar 31 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
PHP读取XML格式文件的方法总结
Feb 27 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获取金书网的书名的实现代码
2010/06/11 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
php+mysql数据库查询实例
2015/01/21 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
使用正则替换变量
2007/05/05 Javascript
javascript 处理HTML元素必须避免使用的一种方法
2009/07/30 Javascript
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
javascript 函数调用的对象和方法
2010/07/01 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
Python里隐藏的“禅”
2014/06/16 Python
简单的Python2.7编程初学经验总结
2015/04/01 Python
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
详解python statistics模块及函数用法
2019/10/27 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
自荐信的禁忌和要点
2013/10/15 职场文书
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python
SQL Server中锁的用法
2022/05/20 SQL Server
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python