天天看點

遞歸周遊無限極分類菜單、菜單樹。(php版&&java版)

文章目錄

        • 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;
    }

}

           

參考連結