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中在PDO中使用事务(Transaction)
May 14 PHP
php实现的九九乘法口诀表简洁版
Jul 28 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
PHP文件读取功能的应用实例
May 08 PHP
PHP工程师VIM配置分享
Dec 15 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
Sep 22 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
Nov 20 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
Mar 31 PHP
在php的yii2框架中整合hbase库的方法
Sep 20 PHP
laravel实现按月或天或小时统计mysql数据的方法
Oct 09 PHP
php实现快速对二维数组某一列进行组装的方法小结
Dec 04 PHP
PHP控制循环操作的时间
Apr 01 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
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
python基本语法练习实例
2017/09/19 Python
深入理解Python中的*重复运算符
2017/10/28 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
2019/04/05 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
Python pandas.DataFrame 找出有空值的行
2019/09/09 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
Python字节单位转换实例
2019/12/05 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
CSS3 实现的加载动画
2020/12/07 HTML / CSS
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
北大青鸟学生求职信
2013/09/24 职场文书
安全承诺书格式
2014/05/21 职场文书
我的中国梦演讲稿800字
2014/08/19 职场文书
2014年保管员工作总结
2014/11/18 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL