首页 > 计算机技术 > 后端开发 > PHP

PHP遍历无限分级的树状结构二维数组,获取指定节点的子节点和按层级缩进的节点数组

原创 lihf8515 2025年02月10日 17:06
来源:本站 阅读:468

这个主题与我之前的两篇文章《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;
}
作者
昵称:君子如兰
注册时间:2025-01-31 02:47:34
最近更新:2026-01-24 17:01:06
文章总数:94篇
原创 88篇   转载 6篇
友情链接: 海峰收银系统  
Copyright © 2025 hfsoft.top All Rights Reserved.
中华人民共和国工业和信息化部ICP备案序号:皖ICP备2025073039号