实现无限级分类的几个重要方法
所谓无限级分类,指的是分类是无限级延续下去的。比如影视类别分为电影和电视,电影又分为动作片和剧情片,悬疑片,动作片又分为国产动作片和美国动作片,国产动作片又分为90年国产动作片和…..等等。无限层分类,无限个子类。
如下图所示,这个数据表是无限级分类的缩影。每一行数据的pid代表它的上级,上级还有上级,直到pid为0。
现在问题来了,任意找出一条数据怎么知道,它的祖级菜单是哪一条。如果要找到答案就要顺着pid一层一层找上去。有的程序员为了省去麻烦把pid这一列做成了详细的层级的关系,类似于’1,2,5’这种写法,貌似是后期使用会方便一些。可是明明可以靠逻辑实现的数据非要重复写出来不太符合建表的规则。所以我们还是按这张表来实现几个需求。
1,任意一条数据找到祖级菜单。2,将数据转换成多维数组,表现层级关系。3,将数据转换成按层级顺序的一维数组,例如总部-北京总代理-北京朝阳区总代理-北京朝阳区-天津总代理….依次罗列直到最底层。
解释起来实现有些吃力,小编就直接上源码了。
第一题实现方法:
public function tree2($arr) { $temp = array(); foreach($arr as $v) { $temp[$v[id]] = $v; } $temp2 = $temp; foreach($temp as $k=>$v) { if($k!=1) { $pid = $v[pid]; $parent_id = $v[id]; while($pid!=1) { $arr1 = $temp[$pid]; $parent_id = $arr1[id]; $pid = $arr1[pid]; } $temp[$k][parent_id] = $parent_id; }else{ $temp[$k][parent_id] = 1; } } return $temp; }
第二题实现方法:
function generateTree($arr){ $tree = array(); foreach($arr as $arrs){ if(isset($arr[$arrs['pid']])){ $arr[$arrs['pid']]['son'][] = &$arr[$arrs['id']]; }else{ $tree[] = &$arr[$arrs['id']]; } } return $tree; }
第三题实现方法:
public function tree2($arr) { $temp = array(); foreach($arr as $v) { $temp[$v[id]] = $v; } $temp2 = $temp; foreach($temp as $k=>$v) { if($k!=1) { $pid = $v[pid]; $parent_id = $v[id]; while($pid!=1) { $arr1 = $temp[$pid]; $parent_id = $arr1[id]; $pid = $arr1[pid]; } $temp[$k][parent_id] = $parent_id; }else{ $temp[$k][parent_id] = 1; } } $temp1 = array(); foreach($temp as $v) { $temp1[$v[parent_id]][] = $temp2[$v[id]]; } return $this->recycle($temp1); } public function recycle($arr) { static $tmp=array(); if (!is_array ($arr)) { return false; } foreach ($arr as $val ) { if (!is_array ($arr)) { return false; } if(isset($val[id])) { $tmp[]=$val; }else { $this->recycle($val); } } return $tmp; }