免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1543 | 回复: 1
打印 上一主题 下一主题

PHP高效获取树结构信息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-30 14:03 |只看该作者 |倒序浏览
PHP高效获取树结构信息








在开发中,经常有一些简单的树形结构的存储,比如产品的多级分类,多级导航栏菜单等,这些物体有一个特性,就是通常会获取整棵树结构。在数据库里保存树结构的方法主要有三种,最简单的一就是通过一个father_id指向当前结构的父节点。对于这样的小结构,一般我们使用最简单的方式存储。
  当要获取整棵树结构,网上一般用递归法,这种方式代码简单易懂,但是缺点是需要执行多次数据库查询,而且后面几次获取的元素数量很少甚至为0,效率很差。
  其实,遇到这种情况,可以将所有的元素全部从数据库获取出来,然后再根据获取的元素father_id构建树结构,这样就可以解决执行多次数据库查询的性能损耗。下面就以我在实际项目中获取多级导航栏菜单中的函数进抛砖引玉了

Php代码
  1. 1./*  
  2. 2.通过数据库获取所有元素,通过下面函数构造树形结构  
  3. 3.*/  
  4. 4.private function getTree($menus)   
  5. 5.{   
  6. 6.        $id = $level = 0;   
  7. 7.    $menuobjs=array();   
  8. 8.        $tree = array();   
  9. 9.    $notrootmenu=array();   
  10. 10.        foreach($menus as $menu){   
  11. 11.            $menuobj=new stdClass();   
  12. 12.        $menuobj->menu=$menu;   
  13. 13.            $id = $menu['id'];   
  14. 14.        $level = $menu['father_id'];   
  15. 15.        $menuobj->nodes = array();   
  16. 16.        $menuobjs[$id]=$menuobj;   
  17. 17.        if ($level) {   
  18. 18.            $notrootmenu[]=$menuobj;   
  19. 19.        } else {   
  20. 20.            $tree[] = $menuobj;   
  21. 21.        }   
  22. 22.        }   
  23. 23.  
  24. 24.        foreach($notrootmenu as $menuobj){   
  25. 25.            $menu=$menuobj->menu;   
  26. 26.            $id = $menu['id'];   
  27. 27.            $level = $menu['father_id'];   
  28. 28.            $menuobjs[$level]->nodes[]=$menuobj;   
  29. 29.        }   
  30. 30.        return $tree;   
  31. 31.    }   
  32. 32.}  
  33. /*
  34. 通过数据库获取所有元素,通过下面函数构造树形结构
  35. */
  36. private function getTree($menus)
  37. {
  38.             $id = $level = 0;
  39.         $menuobjs=array();
  40.             $tree = array();
  41.         $notrootmenu=array();
  42.             foreach($menus as $menu){
  43.                 $menuobj=new stdClass();
  44.                 $menuobj->menu=$menu;
  45.                     $id = $menu['id'];
  46.                 $level = $menu['father_id'];
  47.                 $menuobj->nodes = array();
  48.                 $menuobjs[$id]=$menuobj;
  49.                 if ($level) {
  50.                         $notrootmenu[]=$menuobj;
  51.                 } else {
  52.                         $tree[] = $menuobj;
  53.                 }
  54.             }

  55.                 foreach($notrootmenu as $menuobj){
  56.                         $menu=$menuobj->menu;
  57.                         $id = $menu['id'];
  58.                         $level = $menu['father_id'];
  59.                         $menuobjs[$level]->nodes[]=$menuobj;
  60.                 }
  61.             return $tree;
  62.     }
  63. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-12-30 20:44 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP