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里的JS打印函数
Oct 09 PHP
用Flash图形化数据(二)
Oct 09 PHP
PHP 数据库树的遍历方法
Feb 06 PHP
php设计模式 Factory(工厂模式)
Jun 26 PHP
PHP动态创建Web站点的方法
Aug 14 PHP
PHP循环语句笔记(foreach,list)
Nov 29 PHP
使用php实现下载生成某链接快捷方式的解决方法
May 07 PHP
2014过年倒计时示例
Jan 31 PHP
php数组编码转换示例详解
Mar 11 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
Dec 29 PHP
实例分析PHP中PHPMailer发邮件
Dec 13 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 无极分类(递归)实现代码
2010/01/05 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
javascript 贪吃蛇实现代码
2008/11/22 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
numba提升python运行速度的实例方法
2021/01/25 Python
python re模块常见用法例举
2021/03/01 Python
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
JAVA程序员面试题
2012/10/03 面试题
外贸业务员的岗位职责
2013/11/23 职场文书
农救科工作职责
2013/11/27 职场文书
个人简历自荐信
2013/12/05 职场文书
特教教师先进事迹
2014/05/21 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
JUnit5常用注解的使用
2021/07/02 Java/Android
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python