迭代N叉树结构的指定Parent节点的所有Son节点ID

jerry thinkphp 2015年11月19日 收藏
本人在给客户开发一款直销软件的时候,需要计算差额业绩,也就是计算N叉树结构的任意父节点以下的所有子节点的数据。
常规的递归是循环的方式去循环的方式去嵌套,但是在实际过程中,这样的方法可能效率没有那么高,那么,本人花了两天时间采用了另外一种快速递归的方式,可以降低递归的次数。

思路是:采用parent数组的也许能降低迭代的次数,同时更能针对性的读取需要的数组数据,避免毫无意义的迭代,大大增加的方法的使用效率。
废话不多说,直接上代码。
  1.         public function monthDiff2(){
  2.         // 导入一个店主记录
  3.         $info = M('member')->where(array('uid'=>UID))->find();
  4.         // 迭代法计算该店主的直接招商的所有IDs
  5.         $res = M('member')->field('uid,parent,nickname,sons')->select();
  6.         foreach($res as $key=>$vo){
  7.             // 方法一
  8.             $data[$vo['uid']]['id'] = $vo['uid'];
  9.             $data[$vo['uid']]['pid'] = $vo['parent'];
  10.             // 方法二
  11.             $parent[$vo['parent']][$vo['uid']] = $vo['uid'];
  12.         }
  13.         $func = 2;
  14.         $pid = 1;
  15.         import("@.Library.VMSExtends");
  16.         $obj = new \VMSExtends($host,$dbuser,$dbpwd,$dbname);
  17.         if($func==1){
  18.             $resTree = $obj->tree($data,$pid); 
  19.             foreach($resTree as $key){
  20.                 $list[$key['id']] = $key['id'];    
  21.                 asort($list);
  22.             }
  23.         }else{
  24.             $resTree = $obj->treeParent($parent,$pid);
  25.             asort($resTree);
  26.             $list = $resTree;
  27.         }
  28.         dump($list);
  29.     }
  1. class VMSExtends{
  2.         VMSExtends::$treeList = array(); 清空
  3.         static public $treeList = array(); 
  4.     
  5.     public function __construct(){
  6.     
  7.     }
  8.     static public $flg=0;
  9.     static public function tree(&$data,$pid = 0,$count=0) {
  10.         foreach ($data as $key => $value){
  11.             if($value['pid']==$pid){
  12.                 $value['count'] = $count;
  13.                 self::$treeList []=$value;
  14.                 unset($data[$key]);
  15.                 self::tree($data,$value['id'],$count+1);
  16.             }
  17.             //echo '['.self::$flg++.']';
  18.         }
  19.         return self::$treeList;
  20.     }
  21.     static public function treeParent(&$parent,$pid = 0,$count=0) {
  22.         if($parent[$pid]){
  23.             foreach ($parent[$pid] as $key => $value){
  24.                 self::$treeList[$key] = $key;
  25.                 if(empty($parent[$pid])){
  26.                     unset($parent[$value]);
  27.                 }
  28.                 self::treeParent($parent,$key,$count+1);
  29.             }
  30.             unset($parent[$pid]);
  31.         }else{
  32.             self::$treeList[$pid] = $pid;
  33.             unset($parent[$pid]);
  34.         }
  35.         echo '['.self::$flg++.']';
  36.         return self::$treeList;
  37.     }
  38. }
条件:数据一共710条记录,本次查询的ID=1为最高级别(树的顶端)

下面是同样的查询,两个方法的效率:
tree()的效率: 递归次数 504099次


treeParent()的效率:递归次数 709次


本人新建的一个群,主要是为了交流方便:群号:200109347
Thinkphp爱好者群二维码