1.有两种实现方式:a.递归方式,b.迭代方式;
a.递归方式:(实现家谱树和子孙树)
家谱树:
/**
* 获取父类树
* @param array $data 待分类的数据
* @param int $parent_id 要找的祖先节点
* @param int $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;
}
子孙树:
/**
* 获取子孙树
* @param array $data 待分类的数据
* @param int /string $id 要找的子节点id
* @param int $level 指定第一层级的初始level键的值,默认为 0,每递归一轮该level值自增 1 以体现层次
* @return array
*/
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 待分类的数据
* @param int $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;
}
网友评论