加入收藏 | 设为首页 | 会员中心 | 我要投稿 梧州站长网 (https://www.0774zz.cn/)- 云原生、分布式云、媒体处理、业务安全、数据可视化!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php数组转换成树的几个例子

发布时间:2022-07-24 11:36:10 所属栏目:PHP教程 来源:互联网
导读:下面我整理了一些常用的数组转换成树的实例与大家一起学习,我想大家都会很喜欢这篇文章的.Php代码如下: * $sourceArr 原来的数组 * $key 主键 * $parentKey 与主键关联的父主键 * $childrenKey 生成的孩子的键名 * */ function arrayToTree($sourceArr, $key
  下面我整理了一些常用的数组转换成树的实例与大家一起学习,我想大家都会很喜欢这篇文章的.Php代码如下:
 
  * $sourceArr 原来的数组  
  * $key 主键  
  * $parentKey 与主键关联的父主键  
  * $childrenKey 生成的孩子的键名  
  *  
  */   
     
  function arrayToTree($sourceArr, $key, $parentKey, $childrenKey)   
  {   
      $tempSrcArr = array();   
      foreach ($sourceArr as  $v)   
      {   
          $tempSrcArr[$v[$key]] = $v;   
      }   
      $i = 0;   
      $count = count($sourceArr);   
      for($i = ($count - 1); $i >=0; $i--)   
      {   
          if (isset($tempSrcArr[$sourceArr[$i][$parentKey]]))   
          {   
             $tArr = array_pop($tempSrcArr);   
             $tempSrcArr[$tArr[$parentKey]][$childrenKey] = (isset($tempSrcArr[$tArr[$parentKey]][$childrenKey]) && is_array($tempSrcArr[$tArr[$parentKey]][$childrenKey])) ? $tempSrcArr[$tArr[$parentKey]][$childrenKey] : array();   
             array_push ($tempSrcArr[$tArr[$parentKey]][$childrenKey], $tArr);   
          }   
      }   
      return $tempSrcArr;   
  }   
  PHP代码如下:
 
   * 将数组转换成树  
   * 例子:将 array(  
              array('id'=>1,'parentId' => 0,'name'=> 'name1')  
              ,array('id'=>2,'parentId' => 0,'name'=> 'name2')  
              ,array('id'=>4,'parentId' => 1,'name'=> 'name1_4')  
              ,array('id'=>15,'parentId' => 1,'name'=> 'name1_5')  
      );
   
  /*转换成  
   * Array(  
      [1] => Array([id] => 1  
              [parentId] => 0  
              [name] => name1  
              [children] => Array(  
                      [0] => Array([id] => 15,[parentId] => 1,[name] => name1_5)  
                      [1] => Array([id] => 4,[parentId] => 1,[name] => name1_4)
                  )  
          )  
      [2] => Array([id] => 2,[parentId] => 0,[name] => name2)  
  )  
  */
  * @param array $sourceArr 要转换的数组
 
  * @param string $key 数组中确认父子的key,例子中为“id”
 
  * @param string $parentKey 数组中父key,例子中为“parentId”
 
  * @param type $childrenKey 要在树节点上索引子节点的key,例子中为“children”
 
  * @return array 返回生成的树
 
  PHP代码如下:
 
  function arrayToTree($sourceArr, $key, $parentKey, $childrenKey)   
  {   
      $tempSrcArr = array();   
     
      $allRoot = TRUE;   
      foreach ($sourceArr as  $v)   
      {   
          $isLeaf = TRUE;   
          foreach ($sourceArr as $cv )   
          {   
              if (($v[$key]) != $cv[$key])   
              {   
                  if ($v[$key] == $cv[$parentKey])   
                  {   
                      $isLeaf = FALSE;   
                  }   
                  if ($v[$parentKey] == $cv[$key])   
                  {   
                      $allRoot = FALSE;   
                  }   
              }   
          }   
          if ($isLeaf)   
          {   
              $leafArr[$v[$key]] = $v;   
          }   
          $tempSrcArr[$v[$key]] = $v;   
      }   
      if ($allRoot)   
      {   
          return $tempSrcArr;   
      }   
      else   
      {   
          unset($v, $cv, $sourceArr, $isLeaf);   
          foreach ($leafArr as  $v)   
          {   
              if (isset($tempSrcArr[$v[$parentKey]]))   
              {   
                  $tempSrcArr[$v[$parentKey]][$childrenKey] = (isset($tempSrcArr[$v[$parentKey]][$childrenKey]) && is_array($tempSrcArr[$v[$parentKey]][$childrenKey])) ? $tempSrcArr[$v[$parentKey]][$childrenKey] : array();   
                  array_push ($tempSrcArr[$v[$parentKey]][$childrenKey], $v);  
                  unset($tempSrcArr[$v[$key]]);   
              }   
          }   
          unset($v);   
          return arrayToTree($tempSrcArr, $key, $parentKey, $childrenKey);   
      }   
  }
  PHP代码,递归方法:
 
  $rows = array(   
      0 => array('id' => 1, 'name' => '菜单1', 'parentId' => 0)   
      , 1 => array('id' => 2, 'name' => '菜单2', 'parentId' => 0)   
      , 2 => array('id' => 3, 'name' => '菜单3', 'parentId' => 0)   
      , 3 => array('id' => 4, 'name' => '菜单1_1', 'parentId' => 1)   
      , 4 => array('id' => 5, 'name' => '菜单1_2', 'parentId' => 1)   
      , 5 => array('id' => 6, 'name' => '菜单2_1', 'parentId' => 2)   
  );   
  print_r(getTree($rows, 0, 'id', 'parentId'));  
  代码如下:
 
  /**  
   * 数组根据父id生成树  
   * @staticvar int $depth 递归深度  
   * @param array $data 数组数据  
   * @param integer $pid 父id的值  
   * @param string $key id在$data数组中的键值  
   * @param string $chrildKey 要生成的子的键值  
   * @param string $pKey 父id在$data数组中的键值  
   * @param int $maxDepth 最大递归深度,防止无限递归  
   * @return array 重组后的数组  
   */   
  function getTree($data, $pid = 0, $key = 'id', $pKey = 'parentId', $childKey = 'child', $maxDepth = 0){   
      static $depth = 0;   
      $depth++;   
      if (intval($maxDepth) <= 0)   
      {   
          $maxDepth = count($data) * count($data);   
      }   
      if ($depth > $maxDepth)   
      {   
          exit("error recursion:max recursion depth {$maxDepth}");   
      }   
      $tree = array();   
      foreach ($data as $rk => $rv)   
      {   
          if ($rv[$pKey] == $pid)   
          {   
              $rv[$childKey] = getTree($data, $rv[$key], $key, $pKey, $childKey, $maxDepth);   
              $tree[] = $rv;   
          }   
      }   
      return $tree;   
  }  
  一个实例,代码如下:
 
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  <title>TREE</title>
  <style type="text/css">
  /*树的全局CSS*/
  .kyp_tree{
  font: 12px/2.5 verdana;
  float:left;display:inline;
  }
  .kyp_tree dd{
  margin:0;padding:0;
  margin-left:20px;
  }
  /*链接*/
  .kyp_tree dl a{
  font-size:12px;
  color:#333;
  text-decoration:none;
  }
  .kyp_tree dl a:hover, .kyp_tree dd dt.red_sub a{
  font-size:12px;
  color:#AE0002;
  }
  /*一级dl*/
  .kyp_tree dl{
  border-bottom:1px dashed #ccc;
  margin:0;padding:0;
  }
  /*次级dl*/
  .kyp_tree dl dl, .kyp_tree dl.last{
  border:none;
  }
  .kyp_tree dd dt.currentClass{
  background:url(tree_top.gif) no-repeat 0 -24px;  
  }
  /*一级标题*/
  .kyp_tree dt{
  background:url(tree_top.gif) no-repeat 2px -57px;
  padding-left:15px;
  cursor:pointer;
  font-size:13px;
  height:30px;
  line-height :27px;
  line-height :32px9;
  }
  /*子标题*/
  .kyp_tree dd dt{
  background:url(tree_arrow.gif) no-repeat 2px 10px;
  font-size:12px;
  }
  /*一级张开样式*/
  .kyp_tree dt.open{
  background:url(tree_top.gif) no-repeat 2px 12px;  
  }
  /*张开样式*/
  .kyp_tree dd dt.open{
  background:url(tree_arrow.gif) no-repeat 0 -25px;  
  }
  /*没有子节点的样式*/
  .kyp_tree dt.nosub{
  background:none;
  }
  </style>
  <script type="text/javascript">
  //<![CDATA[
  jQuery.fn.createTree = function (fn, ini){
  var $ = jQuery, ini = Object(ini);
  this.find('dd').hide();
  this.children('dl:last').addClass('last');
  this.find('dt', this).each(function (){
  var nosub = $(this).next('dd').size() == 0;
  if (nosub) {
  $(this).addClass('nosub');
  }
  if (ini.id && ini.id == $(this).attr('classify')) {
  $(this).parents('dd').show().prev('dt').addClass('open');
  $(this).addClass('red_sub');
  if (nosub) {
  $(this).addClass('currentClass')
  }else{
  $(this).next('dd').show();
  $(this).addClass('open')
  } 

(编辑:梧州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读