php经典算法大全(php菜单/评论数据递归分级算法的实现方法)
类别:编程学习 浏览量:2150
时间:2021-11-08 16:29:44 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!
每一个不曾起舞的日子,都是对生命的辜负 ^-^
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对开心学习网的支持。
原文链接:http://www.fidding.me/article/118
热门推荐
- 通用版织梦dedecms(织梦DedeCMS多城市分站插件、站群插件)
- django模板自定义(详解Django项目中模板标签及模板的继承与引用网站中快速布置广告)
- 看懂云服务器带宽大小的区别(云服务器的流量与带宽是如何换算?)
- docker 默认内存(docker 运行指定内存的操作)
- laravel服务器设置教程(laravel框架模型、视图与控制器简单操作示例)
- javascript动作事件有哪些(JavaScript之事件循环案例讲解)
- web界面设计的建议
- nginx与tomcat长连接(Windows下使用Nginx+Tomcat做负载均衡的完整步骤)
- 小鸟云怎么登录服务器(小鸟云服务器登陆图文教程)
- mysql怎么和sqlyog连接(Mysql桌面工具之SQLyog资源及激活使用方法告别黑白命令行)