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版
Apr 20 PHP
PHP中$_FILES的使用方法及注意事项说明
Feb 14 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
CI框架安全类Security.php源码分析
Nov 04 PHP
学习php设计模式 php实现状态模式
Dec 07 PHP
smarty自定义函数用法示例
May 20 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
PHP删除数组中特定元素的两种方法
Feb 28 PHP
PHP预定义接口――Iterator用法示例
Jun 05 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
实用函数4
2007/11/08 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
Draggable Elements 元素拖拽功能实现代码
2011/03/30 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
JavaScript类的写法
2016/09/17 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
vue-router单页面路由
2017/06/17 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
webpack打包node.js后端项目的方法
2018/03/10 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
Vue watch响应数据实现方法解析
2020/07/10 Javascript
零基础写python爬虫之神器正则表达式
2014/11/06 Python
Python脚本实现网卡流量监控
2015/02/14 Python
构建Python包的五个简单准则简介
2015/06/15 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
详解python中的 is 操作符
2017/12/26 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
Python中Selenium库使用教程详解
2020/07/23 Python
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
社区党建工作汇报材料
2014/08/14 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang