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 相关文章推荐
Apache设置虚拟WEB
Oct 09 PHP
PHP 中的批处理的实现
Jun 14 PHP
smarty模板局部缓存方法使用示例
Jun 17 PHP
php管理nginx虚拟主机shell脚本实例
Nov 19 PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
Apr 20 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
Laravel日志用法详解
Oct 09 PHP
php die()与exit()的区别实例详解
Dec 03 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
Feb 04 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 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 empty函数 使用说明
2009/08/10 PHP
PHP采集腾讯微博的实现代码
2012/01/19 PHP
php实现rc4加密算法代码
2012/04/25 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
c#+jquery实现获取radio和checkbox的值
2020/09/12 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
Flask SQLAlchemy一对一,一对多的使用方法实践
2013/02/10 Python
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
python中 chr unichr ord函数的实例详解
2017/08/06 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
Python中常用信号signal类型实例
2018/01/25 Python
python numpy元素的区间查找方法
2018/11/14 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
python3实现表白神器
2019/04/09 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
培训自我鉴定
2014/01/31 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
工程安全生产协议书
2014/11/21 职场文书
通知格式
2015/04/27 职场文书
手残删除python之后的补救方法
2021/06/26 Python