比较常见的做法是在建表的时候, 增加一个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' => '武安市'),
);
数据在数据库中存储大概是这个样子, 怎么实现无限极递归呢, 有两种常用的做法, 递归和引用算法
递归算法
/**
* 递归实现无限极分类
* @param $array 分类数据
* @param $pid 父ID
* @param $level 分类级别
* @return $list 分好类的数组 直接遍历即可 $level可以用来遍历缩进
*/
function getTree($array, $pid = 0, $level = 0) {
//声明静态数组,避免递归调用时,多次声明导致数组覆盖
static $list = [];
foreach($array as $key => $value) {
//第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
if ($value['pid'] == $pid) {
//父节点为根节点的节点,级别为0,也就是第一级
$value['level'] = $level;
//把数组放到list中
$list[] = $value;
//把这个节点从数组中移除,减少后续递归消耗
unset($array[$key]);
//开始递归,查找父ID为该节点ID的节点,级别则为原级别+1
getTree($array, $value['id'], $level + 1);
}
}
return $list;
}
/*
* 获得递归完的数据,遍历生成分类
*/
$array = getTree($array);
foreach($array) as $value {
echo str_repeat('--', $value['level']), $value['name'].
'<br />';
}
//输出结果 无限极分类实现ok
河北省
--邯郸市
-- --永年区
--武安市
北京市
--朝阳区
-- --望京
-- --酒仙桥
--通州区
非递归
public static function listToTree($lists, $childKey = 'children'){
$map = [];
$res = [];
foreach($lists as $id => &$item){
// 获取出每一条数据的父id
$pid = &$item['pid'];
// 将每一个item的引用保存到$map中
$map[$item['id']] = &$item;
// 如果在map中没有设置过他的pid, 说明是根节点, pid为0,
if(!isset($map[$pid])){
// 将pid为0的item的引用保存到$res中
$res[$id] = &$item;
}else{
// 如果在map中没有设置过他的pid, 则将该item加入到他父亲的叶子节点中
$pItem = &$map[$pid];
$pItem[$childKey][] = &$item;
}
}
return $res;
}
无限极分类
最新推荐文章于 2024-09-14 17:41:03 发布