首页
> 计算机技术
> 后端开发
> PHP
PHP遍历无限分级的树状结构二维数组,获取指定节点的子节点和按层级缩进的节点数组
原创 lihf8515于2025年02月10日 17:06发表
来源:本站 阅读:97
这个主题与我之前的两篇文章《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; | |
} | |
阅读排行榜