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+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
Jul 15 PHP
php绘图中显示不出图片的原因及解决
Mar 05 PHP
php setcookie函数的参数说明及其用法
Apr 20 PHP
php源码分析之DZX1.5加密解密函数authcode用法
Jun 17 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
两种php实现图片上传的方法
Jan 22 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
May 19 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
php中字符串和整数比较的操作方法
Jun 06 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
PHP sdk实现在线打包代码示例
Dec 09 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
用文本文件制作留言板提示(上)
2006/10/09 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
javascript中的几个运算符
2007/06/29 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
node.js入门学习之url模块
2017/02/25 Javascript
ES6解构赋值实例详解
2017/10/31 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
Python数据可视化:箱线图多种库画法
2019/11/06 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
英语专业毕业生自荐信
2013/10/28 职场文书
晚会邀请函范文
2014/01/24 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
《猴子种果树》教学反思
2014/04/26 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
公司收款委托书范本
2014/09/20 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
治庸问责工作总结
2015/08/11 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电