无限级分类
1.有两种实现方式:a.递归方式,b.迭代方式;
a.递归方式:(实现家谱树和子孙树)
家谱树:
/**
* 获取父类树
* @paramarray$data待分类的数据
* @paramint$parent_id要找的祖先节点
* @paramint$level指定第一层级的初始level键的值,默认为 0,每递归一轮该level值自增 1 以体现层次
* @return array
*/
public function getAncestry($data, $parent_id = 0, $level = 0)
{
static $ancestry = array();
if(empty($data) || !is_array($data)){
return [];
}
foreach ($data as $key => $value) {
if ($value['id'] === $parent_id) {
$ancestry[] = $value;
$value['level'] = $level;
$this->getAncestry($data, $value['parent_id'], $level+1);
}
}
return $ancestry;
}
子孙树:
/**
* 获取子孙树
* @paramarray $data待分类的数据
* @paramint /string$id要找的子节点id
* @paramint $level指定第一层级的初始level键的值,默认为 0,每递归一轮该level值自增 1 以体现层次
* @returnarray
*/
function getSubTree($data, $id = 0, $level = 0)
{
static $son = array();
if (empty($data) || !is_array($data)) {
return [];
}
foreach ($data as $key => $value) {
if ($value['parent_id'] == $id) {
$value['level'] = $level;
$son[] = $value;
//$value['child']=$this->getSubTree($data,$value['id'],$level+1);
//展示层级关系
$this->getSubTree($data, $value['id'], $level+1);
}
}
return $son;
}
b.迭代方式:(实现家谱树和子孙树)
家谱树:
/**
* 获取父类树
* @param$data待分类的数据
* @paramint $parent_id要找的祖先节点
* @return array
*/
function getAncestry1($data, $parent_id = 0) {
$ancestry = array();
if (empty($data) || !is_array($data)) {
return [];
}
while($parent_id > 0) {
foreach($data as $value) {
if($value['id'] == $parent_id) {
$ancestry[] = $value;
$parent_id = $value['parent_id'];
}
}
}
return $ancestry;
}
子孙树:
/**
* 获取子孙树
* @param $data待分类的数据
* @param int $id$id要找的子节点id
* @return array
*/
function getSubTree1($data, $id = 0) {
$task = array($id);
//栈 任务表
$child = array();
?
while(!empty($task)) {
$flag = false;
//是否找到节点标志
foreach($data as $key => $value) {
//判断是否是子孙节点的条件 与 递归方式一致
if($value['parent_id'] == $id) {
$child[] = $value;
//节点存入数组
array_push($task , $value['id']);
//节点id入栈
$id = $value['id'];
//判断条件切换
unset($data[$key]);
//删除节点
$flag = true;
//找到节点标志
}
}
//flag == false说明已经到了叶子节点 无子孙节点了
if($flag == false) {
array_pop($task);
// 出栈
$id = end($task);
//寻找栈顶id的子节点
}
}
return $child;
【无限级分类】}
推荐阅读
- jhipster|jhipster 升级无效问题
- CET4听力微技能一
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 二十年后的家乡
- 唐嫣可真会穿,西装搭牛仔裤都能穿出高级感,一双大长腿太抢镜
- gitlab|Gitlab升级(12.2.1到14.6.4)
- 2018.03.18
- 幸福是个比较级
- 私有化轻量级持续集成部署方案--03-部署web服务(下)
- 这座媲美重庆的绝色山城,深藏国宝级景点,更有绝美高山花海!