php 遞迴生成後臺選單資料
阿新 • • 發佈:2020-09-01
遞迴函式: 自己呼叫自己 , 在多層邏輯(>=3)的時候就考慮遞迴函數了; 個人理解小於3層邏輯的還是用foreach迴圈處理資料, 畢竟使用遞迴函式開銷還是比較大的 , 而且沒有寫好判斷條件的話 很容易出現死迴圈(這個就很危險了)
一般後臺選單生成邏輯:
1:先從資料庫中查詢出所有有效的選單資料(建立資料的時候就已經綁定了上下級關係)基本上也是一個二維陣列資料; 如下(我自己手動創造的資料)
1 $arr = [ 2 [ 3 'id' =>1, 4 'pid'=>0, 5 'is_menu'=>1, 6'name' => '商城管理' 7 ], 8 [ 9 'id' =>2, 10 'pid'=>1, 11 'is_menu'=>1, 12 'name' =>'店鋪列表' 13 ], 14 [ 15 'id' =>3, 16 'pid'=>1, 17'is_menu'=>1, 18 'name' =>'商品列表' 19 ], 20 [ 21 'id' =>4, 22 'pid'=>2, 23 'is_menu'=>1, 24 'name' =>'店鋪設定' 25 ], 26 [ 27 'id' =>5, 28'pid'=>2, 29 'is_menu'=>1, 30 'name' =>'店鋪資訊' 31 ], 32 [ 33 'id' =>6, 34 'pid'=>3, 35 'is_menu'=>0, 36 'name' =>'新增商品' 37 ], 38 [ 39 'id' =>7, 40 'pid'=>1, 41 'is_menu'=>1, 42 'name' =>'商品分類管理' 43 ], 44 [ 45 'id' =>7, 46 'pid'=>3, 47 'is_menu'=>0, 48 'name' =>'編輯商品' 49 ] 50 ];
### 遞迴函式
1 function create_tree_list( $pid , $arr, &$tree = [] ){ 2 foreach ( $arr as $key => $vo ){ 3 if( $vo['pid'] == $pid ){ 4 $c= create_tree_list( $vo['id'] ,$arr ); 5 if( $c ){ 6 $vo['children'] = $c; 7 } 8 $tree[] = $vo; 9 } 10 } 11 return $tree; 12 }
### 呼叫遞迴函式
1 $pid = 0; //預設從第一層資料開始 2 $tree_list = create_tree_list( $pid , $arr ); 3 return $tree_list;
###得到的資料結果
1 [ 2 { 3 "id": 1, 4 "pid": 0, 5 "is_menu": 1, 6 "name": "商城管理", 7 "children": [ 8 { 9 "id": 2, 10 "pid": 1, 11 "is_menu": 1, 12 "name": "店鋪列表", 13 "children": [ 14 { 15 "id": 4, 16 "pid": 2, 17 "is_menu": 1, 18 "name": "店鋪設定" 19 }, 20 { 21 "id": 5, 22 "pid": 2, 23 "is_menu": 1, 24 "name": "店鋪資訊" 25 } 26 ] 27 }, 28 { 29 "id": 3, 30 "pid": 1, 31 "is_menu": 1, 32 "name": "商品列表", 33 "children": [ 34 { 35 "id": 6, 36 "pid": 3, 37 "is_menu": 0, 38 "name": "新增商品" 39 }, 40 { 41 "id": 7, 42 "pid": 3, 43 "is_menu": 0, 44 "name": "編輯商品" 45 } 46 ] 47 }, 48 { 49 "id": 7, 50 "pid": 1, 51 "is_menu": 1, 52 "name": "商品分類管理" 53 } 54 ] 55 } 56 ]