递归遍历无限极分类菜单、菜单树。(php版&&java版)

2023-05-16

文章目录

        • php版
        • java版

php版

<?php
//定义一个数组
$list = [
	[
		"id" =>1,
		"pid" => 0,
		"level" => "小学"
	],
	[
		"id" =>2,
		"pid" => 1,
		"level" => "一年级"
	],
	[
		"id" =>3,
		"pid" => 1,
		"level" => "二年级"
	],
	[
		"id" =>4,
		"pid" => 2,
		"level" => "一班"
	],
	[
		"id" =>5,
		"pid" => 2,
		"level" => "五班"
	],
	[
		"id" =>6,
		"pid" => 3,
		"level" => "三班"
	],
	[
		"id" =>6,
		"pid" => 0,
		"level" => "中学"
	],
	[
		"id" =>7,
		"pid" => 6,
		"level" => "一年级"
	]
];

//递归方法一
function getChildList($list,$pid = 0) {
	//定义返回数组
	$result = array();
	foreach($list as $v){
		if($v['pid'] == $pid){
			$child = getChildList($list,$v['id']);
			//判断、过滤最后一层数组中的childList
			if(!empty($child)){
				$v['childList'] =$child;
			}
			$result[] = $v;
		}
	}
	return $result;
}
//递归方法二
function to_tree($items, $pid = 'pid', $child = 'children')
{
    $map = [];
    $tree = [];
    foreach ($items as &$it) {
        $map[$it['id']] = &$it;
    }
    foreach ($items as &$it) {
        $parent = &$map[$it[$pid]];
        if ($parent) {
            $parent[$child][] = &$it;
        } else {
            $tree[] = &$it;
        }
    }

    return $tree;
}
//调用这两个方法都可以

java版

package com.zlsn.recursion;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author:zls
 * @Description:测试遍历无限极菜单栏
 * @Date:2021/9/9 14:58
 * @Modified By:
 */
public class Menu {

    @Test
    public void testMenuList() {
        //添加测试数据
        MenuRespVO menu1 = new MenuRespVO();
        menu1.setMenuName("文章管理");
        menu1.setId(1);
        menu1.setPid(0);

        MenuRespVO menu2 = new MenuRespVO();
        menu2.setMenuName("商品管理");
        menu2.setId(2);
        menu2.setPid(0);

        MenuRespVO menu3 = new MenuRespVO();
        menu3.setMenuName("文章分类");
        menu3.setId(3);
        menu3.setPid(1);

        MenuRespVO menu4 = new MenuRespVO();
        menu4.setMenuName("文章内容");
        menu4.setId(4);
        menu4.setPid(1);

        MenuRespVO menu5 = new MenuRespVO();
        menu5.setMenuName("商品分类");
        menu5.setId(5);
        menu5.setPid(2);

        MenuRespVO menu6 = new MenuRespVO();
        menu6.setMenuName("文章二级分类");
        menu6.setId(6);
        menu6.setPid(3);

        List<MenuRespVO> list = new ArrayList<>();//这里一般都是从数据库取出来的
        list.add(menu1);
        list.add(menu2);
        list.add(menu3);
        list.add(menu4);
        list.add(menu5);
        list.add(menu6);
		
		//方法一的使用
        //定义返回List
        List<MenuRespVO> result = new ArrayList<>();

        //遍历所有数据 找到根节点(pid = 0)
        for (MenuRespVO respVO : list) {
            if (respVO.getPid().equals(0)) {
                //找到根节点下的子节点
                findChilds(respVO, list);
                result.add(respVO);
            }
        }

        //输出最后的结果
        System.out.println(result);
		
		//方法二的使用
		List<MenuRespVO> finalResult = dealData(list, 0);
		System.out.println(finalResult);
    }

    //寻找子节点方法一
    private void findChilds(MenuRespVO respVO, List<MenuRespVO> list) {
        //定义返回数组
        List<MenuRespVO> childList = new ArrayList<>();
        for (MenuRespVO item : list) {
            if (respVO.getId().equals(item.getPid())) {
                childList.add(item);
            }
        }
        //如果子节点不存在,直接返回
        if (childList.size() == 0) {
            return;
        }
        //设置父节点的子节点列表
        respVO.setChildList(childList);
        //如果子节点存在,接着递归找下一个子节点
        for (MenuRespVO childs : childList) {
            findChilds(childs, list);
        }

    }
    //寻找子节点方法二
   private List<MenuRespVO> dealData(List<MenuRespVO> list, int pid) {
        List<MenuRespVO> result = new ArrayList<>();
        list.forEach(item -> {
            if (item.getPid().equals(pid)) {
                List<MenuRespVO> child = dealData(list, item.getId());
                if (child.size() != 0) {
                    item.setChildList(child);
                }
                result.add(item);
            }
        });
        return result;
    }

}

参考链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归遍历无限极分类菜单、菜单树。(php版&&java版) 的相关文章

随机推荐

  • 竞赛经验|2019年电赛B题四旋翼无人机组巡线机器人

    竞赛经验 xff5c 2019年电赛B题四旋翼无人机组巡线机器人 参赛背景和比赛回忆 xff1a 1 院校背景 xff1a 2 规则与现实 xff1a 3 比赛流程 xff1a 备赛建议1 器件选择 xff1a 2 针对学习 xff1a 写
  • C语言实现http post请求和get请求,post请求可以上传图片和文件

    文章目录 1 http协议简介2 http协议分析2 1 http请求2 1 1 请求行2 1 1 1 请求方法2 1 1 2 URL2 1 1 3 协议版本2 1 1 4 请求行总结 2 1 2 请求头部2 1 3 请求数据 2 2 ht
  • 软件改变世界

    随着科技的不断进步 xff0c 软件及其相关技术的发展已经深刻地改变了人类社会的方方面面 从交通运输 医疗卫生到商业服务 教育培训 xff0c 软件技术的应用已经深入到我们的日常生活中 xff0c 对我们的生活方式和生产方式都带来了深刻的影
  • MATLAB 比较好入门书籍有哪些推荐

    https www zhihu com topic 19559252 hot https www zhihu com question 19904418 作者 xff1a 陈村 链接 xff1a https www zhihu com qu
  • pymavlink使用简单教程

    这里写自定义目录标题 pymavlink主要包含的模块连接样例 设置任务样例 更改飞行参数param样例 飞行模式总结 pymavlink Pymavlink是MAVLink协议的python实现 自身包括一个源代码生成器 xff08 ge
  • Python案例003——句子生成器

    目标 xff1a 通过用户提供的内容 xff0c 随机生成唯一的句子 提示 xff1a 以用户输入的名词 代词 形容词等作为输入 xff0c 然后将所有数据添加到句子中 xff0c 并将其组合返回 输出固定的 内容 43 用户输入的内容 c
  • 嵌入式软件工程师面试题

    1 int a 10 61 1 2 3 4 5 6 7 8 9 0 int p 61 amp a 1 则p 6 等于8 2 整数数组清零 xff1a bzero memset 3 siezof 测试变量所占地址的字节数 4 main cha
  • 国内代码仓库-码云

    相信使用github的同学会经常碰到这样的情况 xff0c 当我们从github上面下载稍微大一点的代码的时候就经常下载失败 xff0c 下载网速是非常的感人 国内从github上下载代码非常慢 xff0c 解决办法就是修改host或者vp
  • php对接支付宝Web支付-tp5.1框架

    具体流程 1 获取支付宝相关配置 2 传相关参数请求支付宝网关 订单金额 订单号等 3 支付宝请求回调地址 4 回调地址做相关业务处理 数据库增删改查之类 5 处理完成以后返回success给支付宝服务器 1 首先获取应用id和商户私钥以及
  • TX2+realsense D435i跑VSLAM--001--内核劝退篇

    想要使用tx2连接深度相机realsense D435i xff0c 没想到下载好官方自带SDK后 xff0c 说tx2的版本不满足需求 需要至少L4T28 2 1 xff0c 为什么偏偏就差这么一点版本 xff0c 然后查了查 xff0c
  • PHP对接微信支付--Native tp5框架

    这里实现的功能是 xff1a 网页上点击支付 xff0c 然后调用此方法生成二维码并且返回二维码的图片路径 xff0c 然后扫码支付 xff0c 付款成功进行回调 xff0c 在回调地址进行数据库操作 1 配置微信支付参数 微信支付参数 f
  • 微信支付退款 PHP

    应用场景 当交易发生之后一段时间内 xff0c 由于买家或者卖家的原因需要退款时 xff0c 卖家可以通过退款接口将支付款退还给买家 xff0c 微信支付将在收到退款请求并且验证成功之后 xff0c 按照退款规则将支付款按原路退到买家帐号上
  • windows+本地虚拟机搭建gitlab

    一 安装依赖软件 xff04 yum y install policycoreutils openssh server openssh clients postfix 二 设置postfix开机自启 xff0c 并启动 xff0c post
  • 使用Springboot实现简单的增删改查-超详细

    使用Springboot实现简单的增删改查 超详细 xff08 java小白 仅记录 不喜勿喷 xff09 php想转java 就想写个简单的增删改查 写惯了php 感觉java好复杂 php一般就是定义路由 xff0c 然后去控制器 xf
  • Windows下Virtual box安装centos以及virtual box的增强功能(超详细)

    Windows下Virtual box安装centos以及virtual box的增强功能 xff08 超详细 xff09 1 准备工作1 1 下载Virtual Box1 2 下载centos7镜像 2 安装virtual box3 新建
  • 使用crontab遇到的一点问题,报错/var/spool/cron : Permission denied和bash: /usr/bin/chattr: Permission denied

    问题 xff1a 在Linux服务器上设置crontab定时任务执行laravel任务调度的时候 xff0c crontab e 无法保存 会报错 var spool cron Permission denied 于是百度到是var spo
  • 服务器对接码云webhooks实现自动部署--超详细--PHP

    公司代码是放在码云上的 xff0c 每次提交代码 xff0c 都要去服务器上执行一下git pull xff0c 就很麻烦 xff0c 于是想对接一下码云的webhooks实现自动部署 本文参考链接1 xff0c 参考链接2 这里以lara
  • centos7搭建LNMP环境-编译安装&yum安装-超详细

    文章目录 0 首先建议使用docker搭建环境 链接在这 xff01 https blog csdn net handsomezls article details 116936581 1 首先了解编译安装和yum安装的区别 2 yum安装
  • Linux 下使用Docker 安装 LNMP环境以及项目搭建 超详细

    文章目录 一 安装docker二 docker安装php三 docker安装nginx四 docker安装mysql四 1 因为我项目中用到了redis xff0c 所以还需要安装redis容器 五 docker安装Jenkins六 将本地
  • 递归遍历无限极分类菜单、菜单树。(php版&&java版)

    文章目录 php版java版 php版 span class token operator lt span span class token operator span php span class token comment 定义一个数组