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 相关文章推荐
source.php查看源文件
Dec 09 PHP
PHP中通过ADO调用Access数据库的方法测试不通过
Dec 31 PHP
PHP 变量的定义方法
Jan 26 PHP
php数据库抽象层 PDO
May 07 PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
Dec 25 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
Jun 20 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
PHP随机生成唯一HASH值自定义函数
Apr 20 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
Oct 31 PHP
使用Zttp简化Guzzle 调用
Jul 02 PHP
Laravel 加载第三方类库的方法
Apr 20 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
JS中表单的使用小结
2014/01/11 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
JavaScript浮点数及运算精度调整详解
2016/10/21 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
跟老齐学Python之复习if语句
2014/10/02 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
python如何判断IP地址合法性
2020/04/05 Python
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
C#面试常见问题
2013/02/25 面试题
八年级英语教学反思
2014/01/09 职场文书
保护动物的标语
2014/06/11 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
军事理论课感想
2015/08/11 职场文书
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript
Python函数中apply、map、applymap的区别
2021/11/27 Python
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python
app场景下uniapp的扫码记录
2022/07/23 Java/Android