php 无限级分类,超级简单的无限级分类,支持输出树状图


Posted in PHP onJune 29, 2014

无平台限制
只需要告知id,parentid,name 即可

<?php
error_reporting(E_ALL ^ E_NOTICE);

class Tree
{
 
  /**
   +------------------------------------------------
   * 生成树型结构所需要的2维数组
   +------------------------------------------------
   * @author abc
   +------------------------------------------------
   * @var Array
   */
  var $arr = array();
 
  /**
   +------------------------------------------------
   * 生成树型结构所需修饰符号,可以换成图片
   +------------------------------------------------
   * @author abc
   +------------------------------------------------
   * @var Array
   */
  var $icon = array(' │',' ├',' └');
 
  /**
  * @access private
  */
  var $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'=>'三级栏目二')
  *   )
  */
  function tree($arr=array())
  {
    $this->arr = $arr;
    $this->ret = '';
    return is_array($arr);
  }
 
  /**
  * 得到父级数组
  * @param int
  * @return array
  */
  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
  */
  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
  */
  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;
  }
 
  /**
   * -------------------------------------
   * 得到树型结构
   * -------------------------------------
   * @author abc
   * @param $myid 表示获得这个ID下的所有子级
   * @param $str 生成树形结构基本代码, 例如: "<option value=\$id \$select>\$spacer\$name</option>"
   * @param $sid 被选中的ID, 比如在做树形下拉框的时候需要用到
   * @param $adds
   * @param $str_group
   */
  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=>$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 = $id==$sid ? 'selected' : '';
        @extract($a);
        $parentid == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";");
        $this->ret .= $nstr;
        $this->get_tree($id, $str, $sid, $adds.$k.' ',$str_group);
        $number++;
      }
    }
    return $this->ret;
  }
 
  /**
  * 同上一方法类似,但允许多选
  */
  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;
  }
 
  function have($list,$item){
    return(strpos(',,'.$list.',',','.$item.','));
  }
 
  /**
   +------------------------------------------------
   * 格式化数组
   +------------------------------------------------
   * @author abc
   +------------------------------------------------
   */
  function getArray($myid=0, $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 : '';
        @extract($a);
        $a['name'] = $spacer.' '.$a['name'];
        $this->ret[$a['id']] = $a;
        $fd = $adds.$k.' ';
        $this->getArray($id, $sid, $fd);
        $number++;
      }
    }
 
    return $this->ret;
  }
}



$data=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'=>''), 
		 8 => array('id'=>'8','parentid'=>3,'name'=>'三级栏目三'),
		 9 => array('id'=>'9','parentid'=>7,'name'=>'四级分类三'),
     ); 
$tree = new Tree;      
$tree->tree($data);    
 
// 如果使用数组, 请使用 getArray方法 
//$tree->getArray(); 
// 下拉菜单选项使用 get_tree方法 
$html='<select name="tree">'; 
$str = "<option value=\$id \$select>\$spacer\$name</option>"; 
$html .= $tree->get_tree(0,$str,-1).'</select>'; 
echo $html; 
?>
PHP 相关文章推荐
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
Nov 01 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
分享最受欢迎的5款PHP框架
Nov 27 PHP
Smarty模板引擎缓存机制详解
May 23 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
Jul 21 PHP
JavaScript实现删除电脑的关机键
Jul 26 PHP
php5.3后静态绑定用法详解
Nov 11 PHP
thinkPHP5.0框架命名空间详解
Mar 18 PHP
使用PHP+MySql实现微信投票功能实例代码
Sep 29 PHP
php关联数组与索引数组及其显示方法
Mar 12 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 PHP
PHP isset()及empty()用法区别详解
Aug 29 PHP
php防止伪造的数据从URL提交方法
Jun 27 #PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
Jun 27 #PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
Jun 27 #PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
Jun 27 #PHP
php使用GeoIP库实例
Jun 27 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
Jun 26 #PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 #PHP
You might like
php批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
JavaScript高级程序设计
2006/12/29 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
python数据结构之二叉树的建立实例
2014/04/29 Python
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
python简单获取数组元素个数的方法
2015/07/13 Python
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
Python之str操作方法(详解)
2017/06/19 Python
python如何实现int函数的方法示例
2018/02/19 Python
python读csv文件时指定行为表头或无表头的方法
2019/06/26 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
JD Sports荷兰:英国领先的运动时尚零售商
2020/03/13 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
Java程序员综合测试题
2014/04/25 面试题
致跳远运动员广播稿
2014/02/11 职场文书
助人为乐好少年事迹材料
2014/08/18 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
Elasticsearch 聚合查询和排序
2022/04/19 Python