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错误、异常处理机制(补充)
May 07 PHP
深入解析PHP中的(伪)多线程与多进程
Jul 01 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
Sep 28 PHP
PHP zip扩展Linux下安装过程分享
May 05 PHP
php中的观察者模式简单实例
Jan 20 PHP
Laravel 5框架学习之数据库迁移(Migrations)
Apr 08 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
php获取数据库结果集方法(推荐)
Jun 01 PHP
php readfile()修改文件上传大小设置
Aug 11 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
Nov 28 PHP
Yii2框架数据验证操作实例详解
May 02 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 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
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
php字符串操作常见问题小结
2016/10/11 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
window.name代替cookie的实现代码
2010/11/28 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
2018/12/14 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
前端开发基础javaScript的六大作用
2020/08/06 Javascript
js数组的基本使用总结
2021/01/18 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
Python tkinter事件高级用法实例
2018/01/31 Python
python实现windows下文件备份脚本
2018/05/27 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
医药工作者的求职信范文
2013/09/21 职场文书
英文留学推荐信范文
2014/01/25 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
护士求职信
2014/07/05 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
管理人员岗位职责
2015/02/14 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
判断Python中的Nonetype类型
2021/05/25 Python