首頁 > 後端開發 > php教程 > php 無限分類 樹狀資料格式化程式碼

php 無限分類 樹狀資料格式化程式碼

高洛峰
發布: 2023-03-03 17:22:01
原創
1649 人瀏覽過

我們知道很多開源軟體的無限分類都是採用遞歸的演算法,但是我們知道遞歸即浪費時間,又浪費空間(記憶體),
上次我也分享了個我自己原創的無限分類生成樹的方法,一熱心php高手網友給我提出了寶貴的建議,我測試了一下,這段程式碼的時間非常之短參考:http://www.oschina.net/code/snippet_98719_11296,我再次整理了一下,發現資料庫查詢出數據之後,我們就已經定好了鍵值,因而實踐中,我們一般會在model中查詢出格式化成主鍵值對應數據的形式,因而我們可以直接用這樣的數據,就少了一層循環。程式碼也非常簡潔。

原來的程式碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

function genTree($items,$id='id',$pid='pid',$son = 'children'){

  $tree = array(); //格式化的树

  $tmpMap = array(); //临时扁平数据

     

  foreach ($items as $item) {

    $tmpMap[$item[$id]] = $item;

  }

     

  foreach ($items as $item) {

    if (isset($tmpMap[$item[$pid]])) {

      $tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]];

    } else {

      $tree[] = &$tmpMap[$item[$id]];

    }

  }

  unset($tmpMap);

  return $tree;

}

   

$items1 = array(

    array('id' => 1, 'pid' => 0, 'name' => '一级11' ),

    array('id' => 11, 'pid' => 0, 'name' => '一级12' ),

    array('id' => 2, 'pid' => 1, 'name' => '二级21' ),

    array('id' => 10, 'pid' => 11, 'name' => '二级22' ),

    array('id' => 3, 'pid' => 1, 'name' => '二级23' ),

    array('id' => 12, 'pid' => 11, 'name' => '二级24' ),

    array('id' => 9, 'pid' => 1, 'name' => '二级25' ),

    array('id' => 14, 'pid' => 1, 'name' => '二级26' ),

    array('id' => 4, 'pid' => 9, 'name' => '三级31' ),

    array('id' => 6, 'pid' => 9, 'name' => '三级32' ),

    array('id' => 7, 'pid' => 4, 'name' => '四级41' ),

    array('id' => 8, 'pid' => 4, 'name' => '四级42' ),

    array('id' => 5, 'pid' => 4, 'name' => '四级43' ),

    array('id' => 13, 'pid' => 4, 'name' => '四级44' ),

    array('id' => 15, 'pid' => 8, 'name' => '五级51' ),

    array('id' => 16, 'pid' => 8, 'name' => '五级52' ),

    array('id' => 17, 'pid' => 8, 'name' => '五级53' ),

    array('id' => 18, 'pid' => 16, 'name' => '六级64' ),

);

var_dump(genTree($items1));

登入後複製

以下是補充:

1

2

3

4

5

6

7

8

9

10

/**

 * 此方法由@Tonton 提供

 * http://my.oschina.net/u/918697

 * @date 2012-12-12

 */

function genTree5($items) {

  foreach ($items as $item)

    $items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];

  return isset($items[0]['son']) ? $items[0]['son'] : array();

}

登入後複製

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

/**

 * 将数据格式化成树形结构

 * @author Xuefen.Tong

 * @param array $items

 * @return array

 */

function genTree9($items) {

  $tree = array(); //格式化好的树

  foreach ($items as $item)

    if (isset($items[$item['pid']]))

      $items[$item['pid']]['son'][] = &$items[$item['id']];

    else

      $tree[] = &$items[$item['id']];

  return $tree;

}

   

$items = array(

  1 => array('id' => 1, 'pid' => 0, 'name' => '江西省'),

  2 => array('id' => 2, 'pid' => 0, 'name' => '黑龙江省'),

  3 => array('id' => 3, 'pid' => 1, 'name' => '南昌市'),

  4 => array('id' => 4, 'pid' => 2, 'name' => '哈尔滨市'),

  5 => array('id' => 5, 'pid' => 2, 'name' => '鸡西市'),

  6 => array('id' => 6, 'pid' => 4, 'name' => '香坊区'),

  7 => array('id' => 7, 'pid' => 4, 'name' => '南岗区'),

  8 => array('id' => 8, 'pid' => 6, 'name' => '和兴路'),

  9 => array('id' => 9, 'pid' => 7, 'name' => '西大直街'),

  10 => array('id' => 10, 'pid' => 8, 'name' => '东北林业大学'),

  11 => array('id' => 11, 'pid' => 9, 'name' => '哈尔滨工业大学'),

  12 => array('id' => 12, 'pid' => 8, 'name' => '哈尔滨师范大学'),

  13 => array('id' => 13, 'pid' => 1, 'name' => '赣州市'),

  14 => array('id' => 14, 'pid' => 13, 'name' => '赣县'),

  15 => array('id' => 15, 'pid' => 13, 'name' => '于都县'),

  16 => array('id' => 16, 'pid' => 14, 'name' => '茅店镇'),

  17 => array('id' => 17, 'pid' => 14, 'name' => '大田乡'),

  18 => array('id' => 18, 'pid' => 16, 'name' => '义源村'),

  19 => array('id' => 19, 'pid' => 16, 'name' => '上坝村'),

);

  

print_r(genTree5($items));

print_r(genTree9($items));

//后者输出格式,前者类似,只是数组键值不一样,不过不影响数据结构

  

/*

Array

(

[0] => Array

  (

    [id] => 1

    [pid] => 0

    [name] => 江西省

    [son] => Array

      (

        [0] => Array

          (

            [id] => 3

            [pid] => 1

            [name] => 南昌市

          )

   

        [1] => Array

          (

            [id] => 13

            [pid] => 1

            [name] => 赣州市

            [son] => Array

              (

                [0] => Array

                  (

                    [id] => 14

                    [pid] => 13

                    [name] => 赣县

                    [son] => Array

                      (

                      [0] => Array

                        (

                          [id] => 16

                          [pid] => 14

                          [name] => 茅店镇

                          [son] => Array

                            (

                            [0] => Array

                              (

                              [id] => 18

                              [pid] => 16

                              [name] => 义源村

                              )

   

                            [1] => Array

                              (

                              [id] => 19

                              [pid] => 16

                              [name] => 上坝村

                              )

   

                            )

   

                        )

   

                      [1] => Array

                        (

                          [id] => 17

                          [pid] => 14

                          [name] => 大田乡

                        )

   

                      )

   

                  )

   

                [1] => Array

                  (

                    [id] => 15

                    [pid] => 13

                    [name] => 于都县

                  )

   

              )

   

          )

   

      )

   

  )

   

[1] => Array

  (

    [id] => 2

    [pid] => 0

    [name] => 黑龙江省

    [son] => Array

      (

        [0] => Array

          (

            [id] => 4

            [pid] => 2

            [name] => 哈尔滨市

            [son] => Array

              (

              [0] => Array

                (

                  [id] => 6

                  [pid] => 4

                  [name] => 香坊区

                  [son] => Array

                    (

                    [0] => Array

                      (

                        [id] => 8

                        [pid] => 6

                        [name] => 和兴路

                        [son] => Array

                          (

                            [0] => Array

                              (

                              [id] => 10

                              [pid] => 8

                              [name] =>

                               东北林业大学

                              )

   

                            [1] => Array

                              (

                              [id] => 12

                              [pid] => 8

                              [name] =>

                              哈尔滨师范大学

                              )

   

                          )

   

                      )

   

                    )

   

                )

   

              [1] => Array

                (

                  [id] => 7

                  [pid] => 4

                  [name] => 南岗区

                  [son] => Array

                    (

                    [0] => Array

                      (

                      [id] => 9

                      [pid] => 7

                      [name] => 西大直街

                      [son] => Array

                        (

                        [0] => Array

                          (

                          [id] => 11

                          [pid] => 9

                          [name] =>

                           哈尔滨工业大学

                          )

   

                        )

   

                      )

   

                    )

   

                )

   

              )

   

          )

   

        [1] => Array

          (

            [id] => 5

            [pid] => 2

            [name] => 鸡西市

          )

   

      )

   

  )

)*/

登入後複製

極為簡單有效! ! !非常受用!

更多php 無限分類 樹形資料格式化程式碼相關文章請關注PHP中文網!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板