1. 程式人生 > 實用技巧 >php 遞迴生成後臺選單資料

php 遞迴生成後臺選單資料

遞迴函式: 自己呼叫自己 , 在多層邏輯(>=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 ]