递归遍历无限极分类菜单、菜单树。(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;
    }

}

参考链接

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值