首页
> 计算机技术
> 后端开发
> PHP
PHP遍历无限分级的树状结构二维数组,获取指定节点的子节点和按层级缩进的节点数组
原创 lihf8515于2025年02月10日 17:06发表
来源:本站 阅读:88
这个主题与我之前的两篇文章《PHP使用引用方式生成无限分级的树状结构二维数组》和《PHP遍历无限分级的二维数组,获取指定节点的全部父节点和全部子节点》相关,不同点在于那篇文章遍历的是二维数组,这篇文章中所讲解的是遍历树状二维数组。
《PHP使用引用方式生成无限分级的树状结构二维数组》原文地址: https://www.hfsoft.top/article/47.html
《PHP遍历无限分级的二维数组,获取指定节点的全部父节点和全部子节点》原文地址: https://www.hfsoft.top/article/46.html
这里使用的仍然是递归算法,主要有如下几个功能:
1、遍历树状结构数组,返回指定节点的全部子节点ID值组成的字符串。
2、遍历树状结构数组,返回指定级次的全部节点值和节点名称组成的数组。
3、遍历树状结构数组,返回全部节点值和按层级缩进的节点名称组成的数组。
具体如何组合使用,实现自己需要的功能,这就要看您的需求而定,代码如下:
/**
* 遍历树状结构数组,返回指定节点的全部子节点ID值组成的字符串,
* 由于最终返回的字符串末尾有一个逗号,所以一般都不直接调用它,而是调用getTreeSubNode来获取
* @param $array
* @param $id
* @return @string
*/
function treeFindSubNode($treeArr, $id=0, $hasChildren=false){
$str = "";
foreach($treeArr as $value){ //遍历所有项
if ($hasChildren){//如果是指定节点的子节点则添加此节点到返回串中
$str .= $value['id'].",";
if (isset($value['children'])){//递归下级子节点
$str .= treeFindSubNode($value['children'], $id, true);
}
}else{
if ($value['id'] === $id){//是指定节点则添加此节点到返回串中
if (isset($value['children'])){//递归下级子节点
$str .= treeFindSubNode($value['children'], $id, true);
}
}else{
if (isset($value['children'])){
$str .= treeFindSubNode($value['children'], $id, false);
}
}
}
}
return $str;
}
/**
* 遍历树状结构数组,返回指定节点的全部子节点ID值组成的字符串
* @param $array
* @param $id
* @return @string
*/
function getTreeSubNode($treeArr, $id=0){
$str = treeFindSubNode($treeArr, $id, false);
if(strlen($str) != 0){
$str = substr($str, 0, strlen($str) -1);
}
return $str;
}
/**
* 遍历树状结构数组,返回指定级次的全部节点值和节点名称组成的数组
* @param $array
* @param $level
* @return @array
*/
function getLevelNode($treeArr, $target_level=1, $cur_level=1){
$arr = [];
foreach($treeArr as $value){ //遍历所有项
if ($cur_level == $target_level){//如果当前级次是需要获取的级次
$tmp = [];
$tmp['id'] = $value['id'];
$tmp['title'] = $value['title'];
array_push($arr, $tmp);
}else{
if (isset($value['children'])){
$arr = array_merge($arr, getLevelNode($value['children'], $target_level, $cur_level+1));
}
}
}
return $arr;
}
/**
* 遍历树状结构数组,返回全部节点值和按层级缩进的节点名称组成的数组
* @param $array
* @return @array
*/
function getIndentNode($treeArr, $cur_level=0){
$arr = [];
foreach($treeArr as $value){ //遍历所有项
$tmp = [];
$tmp['id'] = $value['id'];
if (!isset($value['children'])){//如果当前节点是叶子节点
$tmp['title'] = str_repeat(' ', $cur_level) . $value['title'];
array_push($arr, $tmp);
}else{
$tmp['title'] = str_repeat(' ', $cur_level) . $value['title'];
array_push($arr, $tmp);
$arr = array_merge($arr, getIndentNode($value['children'], $cur_level+1));
}
}
return $arr;
}
阅读排行榜