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 array_multisort()函数的使用札记
Jul 03 PHP
深入PHP curl参数的详解
Jun 17 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
Jun 28 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
Jan 31 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
Nov 18 PHP
PHP互换两个变量值的方法(不用第三变量)
Nov 14 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
laravel migrate初学常见错误的解决方法
Oct 11 PHP
PHP设计模式之模板方法模式定义与用法详解
Apr 02 PHP
php微信公众号开发之微信企业付款给个人
Oct 04 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 PHP
php实现自动生成验证码的实例讲解
Nov 17 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
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
分页栏的web标准实现
2011/11/01 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
详解Django框架中用户的登录和退出的实现
2015/07/23 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
python获取栅格点和面值的实现
2020/03/10 Python
Python 自由定制表格的实现示例
2020/03/20 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
python设置中文界面实例方法
2020/10/27 Python
python 爬虫之selenium可视化爬虫的实现
2020/12/04 Python
大学校园活动策划书
2014/02/04 职场文书
美术教师自我鉴定
2014/02/12 职场文书
土建工程师岗位职责
2014/06/10 职场文书
住房抵押登记委托书
2014/09/27 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
闪闪的红星观后感
2015/06/08 职场文书
送给客户微信问候语!
2019/07/04 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
php将xml转化对象的实例详解
2021/11/17 PHP
浅谈Node的内存泄露问题
2022/05/06 NodeJs