面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类
$array = array( array('id' => 1, 'pid' => 0, 'name' => '河北省'), array('id' => 2, 'pid' => 0, 'name' => '北京市'), array('id' => 3, 'pid' => 1, 'name' => '邯郸市'), array('id' => 4, 'pid' => 2, 'name' => '朝阳区'), array('id' => 5, 'pid' => 2, 'name' => '通州区'), array('id' => 6, 'pid' => 4, 'name' => '望京'), array('id' => 7, 'pid' => 4, 'name' => '酒仙桥'), array('id' => 8, 'pid' => 3, 'name' => '永年区'), array('id' => 9, 'pid' => 1, 'name' => '武安市'), );
数据在数据库中存储大概是这个样子,怎么实现无限极递归呢,有两种常用的做法,递归和引用算法
function getTree($arr,$pid=0,$level=0){ static $list=[]; foreach($arr as $key => $value){ if($value['pid'] == $pid){ $value['level']=$level; $list[]=$value; unset($arr[$key]); getTree($arr,$value['id'],$level+1); } } return $list; } $handle_arr = getTree($array); print_r($handle_arr);
打印输出
foreach($handle_arr as $key => $value){ echo str_repeat("-", $value['level']).$value['name']." "; }
结果
河北省 -邯郸市 --永年区 -武安市 北京市 -朝阳区 --望京 --酒仙桥 -通州区
引用方式遍历
<?php function getTree($arr){ $items = array(); $tree = array(); foreach($arr as $key => $value){ $items[$value['id']]=$value; } foreach($items as $k => $v){ if(isset($items[$v['pid']])){ $items[$v['pid']]['son'][] = &$items[$k]; }else{ $tree[] = &$items[$k]; } } print_r($tree); } getTree($array); ?>