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 分页函数multi() discuz
Jun 21 PHP
php数组去重的函数代码
Feb 03 PHP
php引用返回与取消引用的详解
Jun 08 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
php自定文件保存session的方法
Dec 10 PHP
PHP防盗链的基本思想 防盗链的设置方法
Sep 25 PHP
使用PHPMailer发送邮件实例
Feb 15 PHP
php+webSoket实现聊天室示例代码(附源码)
Feb 17 PHP
Laravel程序架构设计思路之使用动作类
Jun 07 PHP
PHP crc32()函数讲解
Feb 14 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 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
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
2018/03/13 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
小程序实现密码输入框
2020/11/16 Javascript
jQuery实现本地存储
2020/12/22 jQuery
python基于windows平台锁定键盘输入的方法
2015/03/05 Python
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
Python中is与==判断的区别
2017/03/28 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
eclipse创建python项目步骤详解
2019/05/10 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
美国杰西潘尼官网:JCPenney
2019/06/12 全球购物
机械专业个人求职自荐信格式
2013/09/21 职场文书
煤矿班组长的职责
2013/12/25 职场文书
小学防溺水制度
2014/01/29 职场文书
护士感人事迹
2014/05/01 职场文书
幼儿园安全生产月活动总结
2014/07/05 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers
Golang日志包的使用
2022/04/20 Golang
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS