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.ini中文版(1)
Oct 09 PHP
PHP网站基础优化方法小结
Sep 29 PHP
php 网上商城促销设计实例代码
Feb 17 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
Nov 01 PHP
PHP面向对象——访问修饰符介绍
Nov 08 PHP
提升PHP性能的21种方法介绍
Jun 25 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
Mar 28 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
Mar 18 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 PHP
PHP的new static和new self的区别与使用
Nov 27 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
php数据访问之查询关键字
2016/05/09 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
JS实现留言板功能
2017/06/17 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
javascript移动端 电子书 翻页效果实现代码
2019/09/07 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
跟老齐学Python之Python文档
2014/10/10 Python
python编程羊车门问题代码示例
2017/10/25 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
python3 logging日志封装实例
2020/04/08 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
Python 在局部变量域中执行代码
2020/08/07 Python
python中的对数log函数表示及用法
2020/12/09 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
英国著名药妆店:Superdrug
2021/02/13 全球购物
化工专业大学生职业生涯规划书
2014/01/14 职场文书
总经理司机岗位职责
2014/02/06 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
入党积极分子考察意见
2015/06/02 职场文书