php 无限分类 树形数据格式化代码
我们知道很多开源软件的无限分类都是采用递归的算法,但是我们知道递归即浪费时间,又浪费空间(内存),
上次我也分享了个我自己原创的无限分类生成树的方法,一热心php高手网友给我提出了宝贵的建议,我测试了一下,这段代码的时间非常之短参考:http://www.oschina.net/code/snippet_98719_11296,我再次整理了一下,发现数据库查询出数据之后,我们就已经定好了键值,因而实践中,我们一般会在model中查询出格式化成主键值对应数据的形式,因而我们可以直接用这样的数据,就少了一层循环。代码也非常简洁。
原来的代码:
functiongenTree($items,$id='id',$pid='pid',$son='children'){ $tree=array();//格式化的树 $tmpMap=array();//临时扁平数据 foreach($itemsas$item){ $tmpMap[$item[$id]]=$item; } foreach($itemsas$item){ if(isset($tmpMap[$item[$pid]])){ $tmpMap[$item[$pid]][$son][]=&$tmpMap[$item[$id]]; }else{ $tree[]=&$tmpMap[$item[$id]]; } } unset($tmpMap); return$tree; } $items1=array( array('id'=>1,'pid'=>0,'name'=>'一级11'), array('id'=>11,'pid'=>0,'name'=>'一级12'), array('id'=>2,'pid'=>1,'name'=>'二级21'), array('id'=>10,'pid'=>11,'name'=>'二级22'), array('id'=>3,'pid'=>1,'name'=>'二级23'), array('id'=>12,'pid'=>11,'name'=>'二级24'), array('id'=>9,'pid'=>1,'name'=>'二级25'), array('id'=>14,'pid'=>1,'name'=>'二级26'), array('id'=>4,'pid'=>9,'name'=>'三级31'), array('id'=>6,'pid'=>9,'name'=>'三级32'), array('id'=>7,'pid'=>4,'name'=>'四级41'), array('id'=>8,'pid'=>4,'name'=>'四级42'), array('id'=>5,'pid'=>4,'name'=>'四级43'), array('id'=>13,'pid'=>4,'name'=>'四级44'), array('id'=>15,'pid'=>8,'name'=>'五级51'), array('id'=>16,'pid'=>8,'name'=>'五级52'), array('id'=>17,'pid'=>8,'name'=>'五级53'), array('id'=>18,'pid'=>16,'name'=>'六级64'), ); var_dump(genTree($items1));
以下是补充:
/** *此方法由@Tonton提供 *http://my.oschina.net/u/918697 *@date2012-12-12 */ functiongenTree5($items){ foreach($itemsas$item) $items[$item['pid']]['son'][$item['id']]=&$items[$item['id']]; returnisset($items[0]['son'])?$items[0]['son']:array(); }
/** *将数据格式化成树形结构 *@authorXuefen.Tong *@paramarray$items *@returnarray */ functiongenTree9($items){ $tree=array();//格式化好的树 foreach($itemsas$item) if(isset($items[$item['pid']])) $items[$item['pid']]['son'][]=&$items[$item['id']]; else $tree[]=&$items[$item['id']]; return$tree; } $items=array( 1=>array('id'=>1,'pid'=>0,'name'=>'江西省'), 2=>array('id'=>2,'pid'=>0,'name'=>'黑龙江省'), 3=>array('id'=>3,'pid'=>1,'name'=>'南昌市'), 4=>array('id'=>4,'pid'=>2,'name'=>'哈尔滨市'), 5=>array('id'=>5,'pid'=>2,'name'=>'鸡西市'), 6=>array('id'=>6,'pid'=>4,'name'=>'香坊区'), 7=>array('id'=>7,'pid'=>4,'name'=>'南岗区'), 8=>array('id'=>8,'pid'=>6,'name'=>'和兴路'), 9=>array('id'=>9,'pid'=>7,'name'=>'西大直街'), 10=>array('id'=>10,'pid'=>8,'name'=>'东北林业大学'), 11=>array('id'=>11,'pid'=>9,'name'=>'哈尔滨工业大学'), 12=>array('id'=>12,'pid'=>8,'name'=>'哈尔滨师范大学'), 13=>array('id'=>13,'pid'=>1,'name'=>'赣州市'), 14=>array('id'=>14,'pid'=>13,'name'=>'赣县'), 15=>array('id'=>15,'pid'=>13,'name'=>'于都县'), 16=>array('id'=>16,'pid'=>14,'name'=>'茅店镇'), 17=>array('id'=>17,'pid'=>14,'name'=>'大田乡'), 18=>array('id'=>18,'pid'=>16,'name'=>'义源村'), 19=>array('id'=>19,'pid'=>16,'name'=>'上坝村'), ); print_r(genTree5($items)); print_r(genTree9($items)); //后者输出格式,前者类似,只是数组键值不一样,不过不影响数据结构 /* Array ( [0]=>Array ( [id]=>1 [pid]=>0 [name]=>江西省 [son]=>Array ( [0]=>Array ( [id]=>3 [pid]=>1 [name]=>南昌市 ) [1]=>Array ( [id]=>13 [pid]=>1 [name]=>赣州市 [son]=>Array ( [0]=>Array ( [id]=>14 [pid]=>13 [name]=>赣县 [son]=>Array ( [0]=>Array ( [id]=>16 [pid]=>14 [name]=>茅店镇 [son]=>Array ( [0]=>Array ( [id]=>18 [pid]=>16 [name]=>义源村 ) [1]=>Array ( [id]=>19 [pid]=>16 [name]=>上坝村 ) ) ) [1]=>Array ( [id]=>17 [pid]=>14 [name]=>大田乡 ) ) ) [1]=>Array ( [id]=>15 [pid]=>13 [name]=>于都县 ) ) ) ) ) [1]=>Array ( [id]=>2 [pid]=>0 [name]=>黑龙江省 [son]=>Array ( [0]=>Array ( [id]=>4 [pid]=>2 [name]=>哈尔滨市 [son]=>Array ( [0]=>Array ( [id]=>6 [pid]=>4 [name]=>香坊区 [son]=>Array ( [0]=>Array ( [id]=>8 [pid]=>6 [name]=>和兴路 [son]=>Array ( [0]=>Array ( [id]=>10 [pid]=>8 [name]=> 东北林业大学 ) [1]=>Array ( [id]=>12 [pid]=>8 [name]=> 哈尔滨师范大学 ) ) ) ) ) [1]=>Array ( [id]=>7 [pid]=>4 [name]=>南岗区 [son]=>Array ( [0]=>Array ( [id]=>9 [pid]=>7 [name]=>西大直街 [son]=>Array ( [0]=>Array ( [id]=>11 [pid]=>9 [name]=> 哈尔滨工业大学 ) ) ) ) ) ) ) [1]=>Array ( [id]=>5 [pid]=>2 [name]=>鸡西市 ) ) ) )*/
极其简单有效!!!非常受用!