首頁 >php教程 >php手册 >迭代N叉树结构的指定Parent节点的所有Son节点ID

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

WBOY
WBOY原創
2016-06-07 11:37:311292瀏覽

本人在给客户开发一款直销软件的时候,需要计算差额业绩,也就是计算N叉树结构的任意父节点以下的所有子节点的数据。
常规的递归是循环的方式去循环的方式去嵌套,但是在实际过程中,这样的方法可能效率没有那么高,那么,本人花了两天时间采用了另外一种快速递归的方式,可以降低递归的次数。
迭代N叉树结构的指定Parent节点的所有Son节点ID
思路是:采用parent数组的也许能降低迭代的次数,同时更能针对性的读取需要的数组数据,避免毫无意义的迭代,大大增加的方法的使用效率。
废话不多说,直接上代码。        public function monthDiff2(){<br>         // 导入一个店主记录<br>         $info = M('member')->where(array('uid'=>UID))->find();<br>         // 迭代法计算该店主的直接招商的所有IDs<br>         $res = M('member')->field('uid,parent,nickname,sons')->select();<br>         foreach($res as $key=>$vo){<br>             // 方法一<br>             $data[$vo['uid']]['id'] = $vo['uid'];<br>             $data[$vo['uid']]['pid'] = $vo['parent'];<br>             // 方法二<br>             $parent[$vo['parent']][$vo['uid']] = $vo['uid'];<br>         }<br>         $func = 2;<br>         $pid = 1;<br>         import("@.Library.VMSExtends");<br>         $obj = new \VMSExtends($host,$dbuser,$dbpwd,$dbname);<br>         if($func==1){<br>             $resTree = $obj->tree($data,$pid); <br>             foreach($resTree as $key){<br>                 $list[$key['id']] = $key['id'];    <br>                 asort($list);<br>             }<br>         }else{<br>             $resTree = $obj->treeParent($parent,$pid);<br>             asort($resTree);<br>             $list = $resTree;<br>         }<br>         dump($list);<br>     }class VMSExtends{<br>         VMSExtends::$treeList = array(); 清空<br>         static public $treeList = array(); <br>     <br>     public function __construct(){<br>     <br>     }<br>     static public $flg=0;<br>     static public function tree(&$data,$pid = 0,$count=0) {<br>         foreach ($data as $key => $value){<br>             if($value['pid']==$pid){<br>                 $value['count'] = $count;<br>                 self::$treeList []=$value;<br>                 unset($data[$key]);<br>                 self::tree($data,$value['id'],$count+1);<br>             }<br>             //echo '['.self::$flg++.']';<br>         }<br>         return self::$treeList;<br>     }<br>     static public function treeParent(&$parent,$pid = 0,$count=0) {<br>         if($parent[$pid]){<br>             foreach ($parent[$pid] as $key => $value){<br>                 self::$treeList[$key] = $key;<br>                 if(empty($parent[$pid])){<br>                     unset($parent[$value]);<br>                 }<br>                 self::treeParent($parent,$key,$count+1);<br>             }<br>             unset($parent[$pid]);<br>         }else{<br>             self::$treeList[$pid] = $pid;<br>             unset($parent[$pid]);<br>         }<br>         echo '['.self::$flg++.']';<br>         return self::$treeList;<br>     }<br> }条件:数据一共710条记录,本次查询的ID=1为最高级别(树的顶端)

下面是同样的查询,两个方法的效率:
tree()的效率: 递归次数 504099次
迭代N叉树结构的指定Parent节点的所有Son节点ID

treeParent()的效率:递归次数 709次
迭代N叉树结构的指定Parent节点的所有Son节点ID

本人新建的一个群,主要是为了交流方便:群号:200109347
Thinkphp爱好者群二维码
迭代N叉树结构的指定Parent节点的所有Son节点ID

AD:真正免费,域名+虚机+企业邮箱=0元

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn