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 Google的translate API代码
Dec 10 PHP
php绝对路径与相对路径之间关系的的分析
Mar 03 PHP
PHP无敌近乎加密方式!
Jul 17 PHP
php统计文件大小,以GB、MB、KB、B输出
May 29 PHP
简单的PHP多图上传小程序代码
Jul 17 PHP
PHP入门之常量简介和系统常量
May 12 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
php实现微信公众号主动推送消息
Dec 31 PHP
php实现的操作excel类详解
Jan 15 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
Mar 31 PHP
PHP递归删除多维数组中的某个值
Apr 17 PHP
php实现微信支付之企业付款
May 30 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如何使用Memcached
2016/04/05 PHP
php禁用cookie后session设置方法分析
2016/10/19 PHP
thinkPHP5.0框架安装教程
2017/03/25 PHP
PHP7内核之Reference详解
2019/03/14 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
Javascript call和apply区别及使用方法
2013/11/14 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
Python中的自省(反射)详解
2015/06/02 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
python for循环remove同一个list过程解析
2019/08/14 Python
利用python在excel中画图的实现方法
2020/03/17 Python
python 如何调用远程接口
2020/09/11 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
中式面点餐厅创业计划书
2014/01/29 职场文书
高级销售求职信
2014/02/21 职场文书
信息技术毕业生自荐信范文
2014/03/13 职场文书
大学生就业意向书范文
2014/04/01 职场文书
门店业绩提升方案
2014/06/08 职场文书
运动会铅球比赛加油稿
2014/09/26 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书
导游词之长城八达岭
2019/09/24 职场文书
图文详解matlab原始处理图像几何变换
2021/07/09 Python