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 类商品秒杀计时实现代码
May 05 PHP
PHP文件操作实现代码分享
Sep 01 PHP
PHP性能优化准备篇图解PEAR安装
Dec 05 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
Aug 19 PHP
ThinkPHP中的create方法与自动令牌验证实例教程
Aug 22 PHP
护卫神php套件 php版本升级方法(php5.5.24)
May 10 PHP
php mysql like 实现多关键词搜索的方法
Oct 29 PHP
ThinkPHP简单使用memcache缓存的方法
Nov 15 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
Apr 23 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
Apr 07 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生成随机密码类分享
2014/06/25 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
jquery 学习之二 属性 文本与值(text,val)
2010/11/25 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
python处理PHP数组文本文件实例
2014/09/18 Python
Python处理Excel文件实例代码
2017/06/20 Python
python入门前的第一课 python怎样入门
2018/03/06 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
使用遗传算法求二元函数的最小值
2020/02/11 Python
个人素质的自我评价分享
2013/12/16 职场文书
给儿子的表扬信
2014/01/15 职场文书
犯错检讨书
2014/02/21 职场文书
幼儿园中班评语大全
2014/04/17 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
安全生产知识竞赛活动总结
2014/07/07 职场文书
代收款委托书范本
2014/10/01 职场文书
2014个人年度工作总结
2014/12/15 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
教师节祝酒词
2015/08/11 职场文书
Python基础之数据结构详解
2021/04/28 Python
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
React forwardRef的使用方法及注意点
2021/06/13 Javascript
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers