php菜单/评论数据递归分级算法的实现方法

 更新时间:2019年08月01日 10:30:31   作者:洪加煌  
这篇文章主要给大家介绍了关于php菜单/评论数据递归分级算法的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用php具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

在开发过程中经常会遇到分级场景,如菜单分级、评论、商品类型分级等;在同一张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中上传文件的的解决方案

    这篇文章主要介绍了php中上传文件的实现代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • PDO实现学生管理系统

    PDO实现学生管理系统

    这篇文章主要为大家详细介绍了PDO实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • php实现websocket实时消息推送

    php实现websocket实时消息推送

    这篇文章主要为大家详细介绍了php实现websocket实时消息推送,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • qq登录,新浪微博登录接口申请过程中遇到的问题

    qq登录,新浪微博登录接口申请过程中遇到的问题

    接口申请下来了,开发很容易的,参数传到就可以了。以前就做过这方面的开发,但是申请还是第一次,网上有关这方面的东东不是很多,所以记录一下申请过程。
    2014-07-07
  • PHP 表单提交及处理表单数据详解及实例

    PHP 表单提交及处理表单数据详解及实例

    本文章向大家介绍表单的一些知识点,然后介绍PHP是如何接收表单数据并如何处理表单数据,文章以一个发送邮件的表单实例来向大家讲解表单提交及php如何处理表单数据,需要的朋友可以参考下
    2016-12-12
  • 微信封装的调用微信签名包的类库

    微信封装的调用微信签名包的类库

    这篇文章主要介绍了微信封装的调用微信签名包的类库的相关资料,需要的朋友可以参考下
    2017-06-06
  • PHP面向对象之领域模型+数据映射器实例(分析)

    PHP面向对象之领域模型+数据映射器实例(分析)

    下面小编就为大家带来一篇PHP面向对象之领域模型+数据映射器实例(分析)。小编觉得挺不错的。现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 基于thinkPHP实现的微信自定义分享功能示例

    基于thinkPHP实现的微信自定义分享功能示例

    这篇文章主要介绍了基于thinkPHP实现的微信自定义分享功能,结合实例形式分析了thinkPHP调用微信接口实现自定义分享功能的相关操作技巧,需要的朋友可以参考下
    2016-09-09
  • Yii框架的redis命令使用方法简单示例

    Yii框架的redis命令使用方法简单示例

    这篇文章主要介绍了Yii框架的redis命令使用方法,结合简单实例形式分析了Yii框架redis命令相关的过期时间设置、数据存储、添加、删除、输出等操作技巧,需要的朋友可以参考下
    2019-10-10
  • php命令行模式代码实例详解

    php命令行模式代码实例详解

    这篇文章主要介绍了关于php命令行模式代码实例详解,有感兴趣的同学可以借鉴参考下
    2021-02-02

最新评论