IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 递归遍历无限极分类菜单、菜单树。(php版&&java版) -> 正文阅读

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

}

参考链接

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 23:53:54  更:2021-09-10 23:54:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:08:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码