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 相关文章推荐
一个简洁的多级别论坛
Oct 09 PHP
优化使用mysql存储session的php代码
Jan 10 PHP
用php获取本周,上周,本月,上月,本季度日期的代码
Aug 05 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
Aug 01 PHP
php include类文件超时问题处理
Feb 06 PHP
如何解决PHP无法实现多线程的问题
Sep 25 PHP
PHP中文竖排转换实现方法
Oct 23 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
ThinkPHP 3使用OSS的方法
Jul 19 PHP
Swoole4.4协程抢占式调度器详解
May 23 PHP
如何用PHP websocket实现网页实时聊天
May 26 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
用session做客户验证时的注意事项
2006/10/09 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
php实现查看邮件是否已被阅读的方法
2013/12/03 PHP
php文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
PHP实现通过get方式识别用户发送邮件的方法
2015/07/16 PHP
PHP入门教程之上传文件实例详解
2016/09/11 PHP
写js时遇到的一些小问题
2010/12/06 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
javascript常用函数(1)
2015/11/04 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
为什么Python中没有&quot;a++&quot;这种写法
2018/11/27 Python
Python同步遍历多个列表的示例
2019/02/19 Python
Python中按值来获取指定的键
2019/03/04 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
2020/02/15 Python
django中嵌套的try-except实例
2020/05/21 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
FC-Moto美国:欧洲最大的摩托车服装和头盔商店之一
2019/08/24 全球购物
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
保密承诺书
2014/03/27 职场文书
学校志愿者活动总结
2014/06/27 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
社区宣传标语口号
2015/12/26 职场文书
Python与C++中梯度方向直方图的实现
2022/03/17 Python
js作用域及作用域链工作引擎
2022/07/07 Javascript