PHP树形结构tree类用法示例


Posted in PHP onFebruary 01, 2019

本文实例讲述了PHP树形结构tree类用法。分享给大家供大家参考,具体如下:

<?php
include 'tree.class.php';
//模拟数据库
$data=array(
  array('id'=>1,'pid'=>0,'name'=>'一级栏目一'),
  array('id'=>2,'pid'=>0,'name'=>'一级栏目二'),
  array('id'=>3,'pid'=>1,'name'=>'二级栏目一'),
  array('id'=>4,'pid'=>3,'name'=>'三级栏目一'),
  array('id'=>5,'pid'=>4,'name'=>'四级栏目一'),
);
//转换数据
$tree_data=array();
foreach ($data as $key=>$value){
  $tree_data[$value['id']]=array(
    'id'=>$value['id'],
    'parentid'=>$value['pid'],
    'name'=>$value['name']
  );
}
/**
 * 输出树形结构
 */
$str="<tr>
  <td><input type='checkbox' name='list[\$id]' value='\$id'></td>
  <td>\$id</td>
  <td>\$spacer\$name</td>
  <td><a href='add.php?id=\$id'>添加</a></td>
  <td><a href='del.php?id=\$id'>删除</a></td>
  <td><a href='update.php?id='\$id'>修改</a></td>
  </tr>";
$tree=new Tree();
$tree->init($tree_data);
echo "<table>";
echo $tree->get_tree(0, $str);
echo "</table>";
echo "<br/>";
echo "<br/>";
echo "<br/>";
echo "<br/>";
/**
 * 输出下拉列表
 */
$str="<option value=\$id \$selected>\$spacer\$name</option>";
$tree=new Tree();
$tree->init($tree_data);
echo "<select>";
echo $tree->get_tree(0, $str,2);
echo "</select>";

运行结果:

PHP树形结构tree类用法示例

tree.class.php:

<?php
/**
* 通用的树型类,可以生成任何树型结构
*/
class tree {
  /**
  * 生成树型结构所需要的2维数组
  * @var array
  */
  public $arr = array();
  /**
  * 生成树型结构所需修饰符号,可以换成图片
  * @var array
  */
  public $icon = array('│','├','└');
  public $nbsp = " ";
  /**
  * @access private
  */
  public $ret = '';
  /**
  * 构造函数,初始化类
  * @param array 2维数组,例如:
  * array(
  *   1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),
  *   2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),
  *   3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),
  *   4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'),
  *   5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'),
  *   6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'),
  *   7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二')
  *   )
  */
  public function init($arr=array()){
    $this->arr = $arr;
    $this->ret = '';
    return is_array($arr);
  }
  /**
  * 得到父级数组
  * @param int
  * @return array
  */
  public function get_parent($myid){
    $newarr = array();
    if(!isset($this->arr[$myid])) return false;
    $pid = $this->arr[$myid]['parentid'];
    $pid = $this->arr[$pid]['parentid'];
    if(is_array($this->arr)){
      foreach($this->arr as $id => $a){
        if($a['parentid'] == $pid) $newarr[$id] = $a;
      }
    }
    return $newarr;
  }
  /**
  * 得到子级数组
  * @param int
  * @return array
  */
  public function get_child($myid){
    $a = $newarr = array();
    if(is_array($this->arr)){
      foreach($this->arr as $id => $a){
        if($a['parentid'] == $myid) $newarr[$id] = $a;
      }
    }
    return $newarr ? $newarr : false;
  }
  /**
  * 得到当前位置数组
  * @param int
  * @return array
  */
  public function get_pos($myid,&$newarr){
    $a = array();
    if(!isset($this->arr[$myid])) return false;
    $newarr[] = $this->arr[$myid];
    $pid = $this->arr[$myid]['parentid'];
    if(isset($this->arr[$pid])){
      $this->get_pos($pid,$newarr);
    }
    if(is_array($newarr)){
      krsort($newarr);
      foreach($newarr as $v){
        $a[$v['id']] = $v;
      }
    }
    return $a;
  }
  /**
  * 得到树型结构
  * @param int ID,表示获得这个ID下的所有子级
  * @param string 生成树型结构的基本代码,例如:"<option value=\$id \$selected>\$spacer\$name</option>"
  * @param int 被选中的ID,比如在做树型下拉框的时候需要用到
  * @return string
  */
  public function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = ''){
    $number=1;
    $child = $this->get_child($myid);
    if(is_array($child)){
      $total = count($child);
      foreach($child as $id=>$value){
        $j=$k='';
        if($number==$total){
          $j .= $this->icon[2];
        }else{
          $j .= $this->icon[1];
          $k = $adds ? $this->icon[0] : '';
        }
        $spacer = $adds ? $adds.$j : '';
        $selected = $id==$sid ? 'selected' : '';
        @extract($value);
        $parentid == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";");
        $this->ret .= $nstr;
        $nbsp = $this->nbsp;
        $this->get_tree($id, $str, $sid, $adds.$k.$nbsp,$str_group);
        $number++;
      }
    }
    return $this->ret;
  }
  /**
  * 同上一方法类似,但允许多选
  */
  public function get_tree_multi($myid, $str, $sid = 0, $adds = ''){
    $number=1;
    $child = $this->get_child($myid);
    if(is_array($child)){
      $total = count($child);
      foreach($child as $id=>$a){
        $j=$k='';
        if($number==$total){
          $j .= $this->icon[2];
        }else{
          $j .= $this->icon[1];
          $k = $adds ? $this->icon[0] : '';
        }
        $spacer = $adds ? $adds.$j : '';
        $selected = $this->have($sid,$id) ? 'selected' : '';
        @extract($a);
        eval("\$nstr = \"$str\";");
        $this->ret .= $nstr;
        $this->get_tree_multi($id, $str, $sid, $adds.$k.' ');
        $number++;
      }
    }
    return $this->ret;
  }
   /**
  * @param integer $myid 要查询的ID
  * @param string $str  第一种HTML代码方式
  * @param string $str2 第二种HTML代码方式
  * @param integer $sid 默认选中
  * @param integer $adds 前缀
  */
  public function get_tree_category($myid, $str, $str2, $sid = 0, $adds = ''){
    $number=1;
    $child = $this->get_child($myid);
    if(is_array($child)){
      $total = count($child);
      foreach($child as $id=>$a){
        $j=$k='';
        if($number==$total){
          $j .= $this->icon[2];
        }else{
          $j .= $this->icon[1];
          $k = $adds ? $this->icon[0] : '';
        }
        $spacer = $adds ? $adds.$j : '';
        $selected = $this->have($sid,$id) ? 'selected' : '';
        @extract($a);
        if (empty($html_disabled)) {
          eval("\$nstr = \"$str\";");
        } else {
          eval("\$nstr = \"$str2\";");
        }
        $this->ret .= $nstr;
        $this->get_tree_category($id, $str, $str2, $sid, $adds.$k.' ');
        $number++;
      }
    }
    return $this->ret;
  }
  /**
   * 同上一类方法,jquery treeview 风格,可伸缩样式(需要treeview插件支持)
   * @param $myid 表示获得这个ID下的所有子级
   * @param $effected_id 需要生成treeview目录数的id
   * @param $str 末级样式
   * @param $str2 目录级别样式
   * @param $showlevel 直接显示层级数,其余为异步显示,0为全部限制
   * @param $style 目录样式 默认 filetree 可增加其他样式如'filetree treeview-famfamfam'
   * @param $currentlevel 计算当前层级,递归使用 适用改函数时不需要用该参数
   * @param $recursion 递归使用 外部调用时为FALSE
   */
  function get_treeview($myid,$effected_id='example',$str="<span class='file'>\$name</span>", $str2="<span class='folder'>\$name</span>" ,$showlevel = 0 ,$style='filetree ' , $currentlevel = 1,$recursion=FALSE) {
    $child = $this->get_child($myid);
    if(!defined('EFFECTED_INIT')){
      $effected = ' id="'.$effected_id.'"';
      define('EFFECTED_INIT', 1);
    } else {
      $effected = '';
    }
    $placeholder =   '<ul><li><span class="placeholder"></span></li></ul>';
    if(!$recursion) $this->str .='<ul'.$effected.' class="'.$style.'">';
    foreach($child as $id=>$a) {
      @extract($a);
      if($showlevel > 0 && $showlevel == $currentlevel && $this->get_child($id)) $folder = 'hasChildren'; //如设置显示层级模式@2011.07.01
      $floder_status = isset($folder) ? ' class="'.$folder.'"' : '';
      $this->str .= $recursion ? '<ul><li'.$floder_status.' id=\''.$id.'\'>' : '<li'.$floder_status.' id=\''.$id.'\'>';
      $recursion = FALSE;
      if($this->get_child($id)){
        eval("\$nstr = \"$str2\";");
        $this->str .= $nstr;
        if($showlevel == 0 || ($showlevel > 0 && $showlevel > $currentlevel)) {
          $this->get_treeview($id, $effected_id, $str, $str2, $showlevel, $style, $currentlevel+1, TRUE);
        } elseif($showlevel > 0 && $showlevel == $currentlevel) {
          $this->str .= $placeholder;
        }
      } else {
        eval("\$nstr = \"$str\";");
        $this->str .= $nstr;
      }
      $this->str .=$recursion ? '</li></ul>': '</li>';
    }
    if(!$recursion) $this->str .='</ul>';
    return $this->str;
  }
  /**
   * 获取子栏目json
   * Enter description here ...
   * @param unknown_type $myid
   */
  public function creat_sub_json($myid, $str='') {
    $sub_cats = $this->get_child($myid);
    $n = 0;
    if(is_array($sub_cats)) foreach($sub_cats as $c) {
      $data[$n]['id'] = iconv(CHARSET,'utf-8',$c['catid']);
      if($this->get_child($c['catid'])) {
        $data[$n]['liclass'] = 'hasChildren';
        $data[$n]['children'] = array(array('text'=>' ','classes'=>'placeholder'));
        $data[$n]['classes'] = 'folder';
        $data[$n]['text'] = iconv(CHARSET,'utf-8',$c['catname']);
      } else {
        if($str) {
          @extract(array_iconv($c,CHARSET,'utf-8'));
          eval("\$data[$n]['text'] = \"$str\";");
        } else {
          $data[$n]['text'] = iconv(CHARSET,'utf-8',$c['catname']);
        }
      }
      $n++;
    }
    return json_encode($data);
  }
  private function have($list,$item){
    return(strpos(',,'.$list.',',','.$item.','));
  }
}
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
[原创]PHP中通过ADODB库实现调用Access数据库之修正版本
Dec 31 PHP
php读取excel文件的简单实例
Aug 26 PHP
php5.3以后的版本连接sqlserver2000的方法
Jul 28 PHP
浅谈php冒泡排序
Dec 30 PHP
Laravel 5框架学习之表单验证
Apr 08 PHP
PHP简单生成缩略图相册的方法
Jul 29 PHP
PHP在线打包下载功能示例
Oct 15 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
Laravel 实现密码重置功能
Feb 23 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
Oct 14 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 PHP
PHP-FPM和Nginx的通信机制详解
Feb 01 #PHP
Laravel框架自定义验证过程实例分析
Feb 01 #PHP
thinkPHP框架RBAC实现原理分析
Feb 01 #PHP
PHP PDOStatement::fetchColumn讲解
Jan 31 #PHP
PHP PDOStatement::fetchAll讲解
Jan 31 #PHP
PHP PDOStatement::fetch讲解
Jan 31 #PHP
PHP PDOStatement::execute讲解
Jan 31 #PHP
You might like
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
微信小程序签到功能
2018/10/31 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
Python实现获取操作系统版本信息方法
2015/04/08 Python
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
Python字符串匹配算法KMP实例
2015/07/18 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
2020/06/29 Python
快速了解Python开发环境Spyder
2020/06/29 Python
详解pandas赋值失败问题解决
2020/11/29 Python
phpquery中文手册
2021/03/18 PHP
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
C#面试题问题集
2016/04/02 面试题
电子商务个人自荐信
2013/12/12 职场文书
综合实践活动总结
2014/05/05 职场文书
迎七一演讲稿
2014/09/12 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
导游词之包公祠
2019/11/25 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
浅谈redis整数集为什么不能降级
2021/07/25 Redis