0

0

9行代码太浪费了,5行代码足矣,不用递归实现无限分类数据的树形格式化

php中文网

php中文网

发布时间:2016-07-25 09:06:33

|

1664人浏览过

|

来源于php中文网

原创

我们知道很多开源软件的无限分类都是采用递归的算法,但是我们知道递归即浪费时间,又浪费空间(内存),
上次我也分享了个我自己原创的无限分类生成树的方法,一热心php高手网友给我提出了宝贵的建议,我测试了一下,这段代码的时间非常之短,参考: http://www.oschina.net/code/snippet_98719_11296,我再次整理了一下,发现数据库查询出数据之后,我们就已经定好了键值,因而实践中,我们一般会在model中查询出格式化成主键值对应数据的形式,因而我们可以直接用这样的数据,就少了一层循环。代码也非常简洁。
  1. /**
  2. * 此方法由@Tonton 提供
  3. * http://my.oschina.net/u/918697
  4. * @date 2012-12-12
  5. */
  6. function genTree5($items) {
  7. foreach ($items as $item)
  8. $items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];
  9. return isset($items[0]['son']) ? $items[0]['son'] : array();
  10. }
  11. /**
  12. * 将数据格式化成树形结构
  13. * @author Xuefen.Tong
  14. * @param array $items
  15. * @return array
  16. */
  17. function genTree9($items) {
  18. $tree = array(); //格式化好的树
  19. foreach ($items as $item)
  20. if (isset($items[$item['pid']]))
  21. $items[$item['pid']]['son'][] = &$items[$item['id']];
  22. else
  23. $tree[] = &$items[$item['id']];
  24. return $tree;
  25. }
  26. $items = array(
  27. 1 => array('id' => 1, 'pid' => 0, 'name' => '江西省'),
  28. 2 => array('id' => 2, 'pid' => 0, 'name' => '黑龙江省'),
  29. 3 => array('id' => 3, 'pid' => 1, 'name' => '南昌市'),
  30. 4 => array('id' => 4, 'pid' => 2, 'name' => '哈尔滨市'),
  31. 5 => array('id' => 5, 'pid' => 2, 'name' => '鸡西市'),
  32. 6 => array('id' => 6, 'pid' => 4, 'name' => '香坊区'),
  33. 7 => array('id' => 7, 'pid' => 4, 'name' => '南岗区'),
  34. 8 => array('id' => 8, 'pid' => 6, 'name' => '和兴路'),
  35. 9 => array('id' => 9, 'pid' => 7, 'name' => '西大直街'),
  36. 10 => array('id' => 10, 'pid' => 8, 'name' => '东北林业大学'),
  37. 11 => array('id' => 11, 'pid' => 9, 'name' => '哈尔滨工业大学'),
  38. 12 => array('id' => 12, 'pid' => 8, 'name' => '哈尔滨师范大学'),
  39. 13 => array('id' => 13, 'pid' => 1, 'name' => '赣州市'),
  40. 14 => array('id' => 14, 'pid' => 13, 'name' => '赣县'),
  41. 15 => array('id' => 15, 'pid' => 13, 'name' => '于都县'),
  42. 16 => array('id' => 16, 'pid' => 14, 'name' => '茅店镇'),
  43. 17 => array('id' => 17, 'pid' => 14, 'name' => '大田乡'),
  44. 18 => array('id' => 18, 'pid' => 16, 'name' => '义源村'),
  45. 19 => array('id' => 19, 'pid' => 16, 'name' => '上坝村'),
  46. );
  47. echo "
    ";
  48. print_r(genTree5($items));
  49. print_r(genTree9($items));
  50. //后者输出格式,前者类似,只是数组键值不一样,不过不影响数据结构
  51. /*
  52. Array
  53. (
  54. [0] => Array
  55. (
  56. [id] => 1
  57. [pid] => 0
  58. [name] => 江西省
  59. [son] => Array
  60. (
  61. [0] => Array
  62. (
  63. [id] => 3
  64. [pid] => 1
  65. [name] => 南昌市
  66. )
  67. [1] => Array
  68. (
  69. [id] => 13
  70. [pid] => 1
  71. [name] => 赣州市
  72. [son] => Array
  73. (
  74. [0] => Array
  75. (
  76. [id] => 14
  77. [pid] => 13
  78. [name] => 赣县
  79. [son] => Array
  80. (
  81. [0] => Array
  82. (
  83. [id] => 16
  84. [pid] => 14
  85. [name] => 茅店镇
  86. [son] => Array
  87. (
  88. [0] => Array
  89. (
  90. [id] => 18
  91. [pid] => 16
  92. [name] => 义源村
  93. )
  94. [1] => Array
  95. (
  96. [id] => 19
  97. [pid] => 16
  98. [name] => 上坝村
  99. )
  100. )
  101. )
  102. [1] => Array
  103. (
  104. [id] => 17
  105. [pid] => 14
  106. [name] => 大田乡
  107. )
  108. )
  109. )
  110. [1] => Array
  111. (
  112. [id] => 15
  113. [pid] => 13
  114. [name] => 于都县
  115. )
  116. )
  117. )
  118. )
  119. )
  120. [1] => Array
  121. (
  122. [id] => 2
  123. [pid] => 0
  124. [name] => 黑龙江省
  125. [son] => Array
  126. (
  127. [0] => Array
  128. (
  129. [id] => 4
  130. [pid] => 2
  131. [name] => 哈尔滨市
  132. [son] => Array
  133. (
  134. [0] => Array
  135. (
  136. [id] => 6
  137. [pid] => 4
  138. [name] => 香坊区
  139. [son] => Array
  140. (
  141. [0] => Array
  142. (
  143. [id] => 8
  144. [pid] => 6
  145. [name] => 和兴路
  146. [son] => Array
  147. (
  148. [0] => Array
  149. (
  150. [id] => 10
  151. [pid] => 8
  152. [name] =>
  153. 东北林业大学
  154. )
  155. [1] => Array
  156. (
  157. [id] => 12
  158. [pid] => 8
  159. [name] =>
  160. 哈尔滨师范大学
  161. )
  162. )
  163. )
  164. )
  165. )
  166. [1] => Array
  167. (
  168. [id] => 7
  169. [pid] => 4
  170. [name] => 南岗区
  171. [son] => Array
  172. (
  173. [0] => Array
  174. (
  175. [id] => 9
  176. [pid] => 7
  177. [name] => 西大直街
  178. [son] => Array
  179. (
  180. [0] => Array
  181. (
  182. [id] => 11
  183. [pid] => 9
  184. [name] =>
  185. 哈尔滨工业大学
  186. )
  187. )
  188. )
  189. )
  190. )
  191. )
  192. )
  193. [1] => Array
  194. (
  195. [id] => 5
  196. [pid] => 2
  197. [name] => 鸡西市
  198. )
  199. )
  200. )
  201. )*/
复制代码


热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

705

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

233

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

117

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

22

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

61

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

30

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

669

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

58

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

linux嵌入式开发+驱动开发视频教程
linux嵌入式开发+驱动开发视频教程

共39课时 | 8.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号