Heim  >  Artikel  >  php教程  >  迭代N叉树结构的指定Parent节点的所有Son节点ID

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

WBOY
WBOYOriginal
2016-06-07 11:37:311249Durchsuche

本人在给客户开发一款直销软件的时候,需要计算差额业绩,也就是计算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元

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn