文章目錄
-
-
-
- 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;
}
}
參考連結