php无限分类且支持输出树状图的详细介绍


Posted in PHP onJune 19, 2013
<?php
/**
* 通用的树型类,可以生成任何树型结构
*/
class tree
{
    /**
    * 生成树型结构所需要的2维数组
    * @var array
    */
    var $arr = array();    /**
    * 生成树型结构所需修饰符号,可以换成图片
    * @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  Midnight(杨云洲),  yangyunzhou@foxmail.com
     * @param $myid 表示获得这个ID下的所有子级
     * @param $str 生成树形结构基本代码, 例如: "<option value=\$id \$select>\$spacer\$name</option>"
     * @param $sid 被选中的ID, 比如在做树形下拉框的时候需要用到
     * @param $adds
     * @param $str_group
     * @return unknown_type
     */
    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' : '';
                //echo $sid.'=>'.$id.' : '.$selected.' . <br/>';
                @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.','));
    }
}
?>

php无限分类且支持输出树状图的详细介绍
php无限分类且支持输出树状图的详细介绍

PHP 相关文章推荐
汉字转化为拼音(php版)
Oct 09 PHP
用PHP 4.2书写安全的脚本
Oct 09 PHP
在php中使用sockets:从新闻组中获取文章
Oct 09 PHP
php解析html类库simple_html_dom(详细介绍)
Jul 05 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
CI框架实现cookie登陆的方法详解
May 18 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 PHP
CodeIgniter框架数据库基本操作示例
May 24 PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
Jun 24 PHP
laravel开发环境homestead搭建过程详解
Jul 03 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
Jun 19 #PHP
具有时效性的php加密解密函数代码
Jun 19 #PHP
一个简单的php加密解密函数(动态加密)
Jun 19 #PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
Jun 19 #PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 #PHP
深入PHP数据加密详解
Jun 18 #PHP
使用array mutisort 实现按某字段对数据排序
Jun 18 #PHP
You might like
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
vue.js实现二级菜单效果
2019/10/19 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
django使用图片延时加载引起后台404错误
2017/04/18 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
Django的models模型的具体使用
2019/07/15 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
python基于event实现线程间通信控制
2020/01/13 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
Python内置函数locals和globals对比
2020/04/28 Python
python中Array和DataFrame相互转换的实例讲解
2021/02/03 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
Linux机考试题
2015/10/16 面试题
毕业生的求职信范文分享
2013/12/04 职场文书
自荐信格式简述
2014/01/25 职场文书
大学班级计划书
2014/04/29 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
三八节标语
2014/06/27 职场文书
财务负责人岗位职责
2015/02/03 职场文书
物资采购管理制度
2015/08/06 职场文书