记录我工作学习生活中的点点滴滴......

近期写的一个无限极分类树状输出控制类
发布于 开发框架
2012-06-20 22:45:10
3935
0

前段时间做项目使用到了无限极分类,当时由于赶时间交工,这部分输出相当的乱,现在终于有时间了,将用到的整理了一下写了一个类,方便今后的使用

其中需要注意的是getPosition,因为用到了引用赋值,所以调用方式和其他不同,我已经在注释中说明了


$position=array(); 
$tree->getPosition(10,$position); 
print_r($position);


另外getTreeArr中的引用变量的用法真心强,这是别人写的代码,一个引用,节省了多少代码,连递归什么都省了

其他倒是没有什么,都是一些常用的东西,试一下就知道了,下面是代码

/*=================================================================== 
# Program: MCPHP - Web Application Framework # HomePage: http://www.ptcms.com # Author: pakey < [email protected] -->
#   AuthorBlog: http://www.pakey.net
#     FileName: tree.class.php
#   LastModify: 2012-06-20 21:43:05
#         Desc: 无限极分类树形结构
====================================================================*/

class Tree {
    //生成树型结构所需要的2维数组    
    public $arr = array();
    
    //当前结构数组信息
    public $pid; //当前栏目父类id
    public $cid; //当前栏目id
    public $name; //当前栏目名称
    

    //生成树型结构所需修饰符号,可以换成图片
    public $icon = array('┃ ','┣━','┗━'); //栏目分隔符
    public $nbsp = ' '; //分隔符 上级栏目与本级栏目之间

    
    /**
    * 构造函数,初始化类
    * @param array 2维数组,例如:
    * array(
    *      1 => array('cid'=>'1','parentid'=>0,'name'=>'一级栏目一'),
    *      2 => array('cid'=>'2','parentid'=>0,'name'=>'一级栏目二'),
    *      3 => array('cid'=>'3','parentid'=>1,'name'=>'二级栏目一'),
    *      4 => array('cid'=>'4','parentid'=>1,'name'=>'二级栏目二'),
    *      5 => array('cid'=>'5','parentid'=>2,'name'=>'二级栏目三'),
    *      6 => array('cid'=>'6','parentid'=>3,'name'=>'三级栏目一'),
    *      7 => array('cid'=>'7','parentid'=>3,'name'=>'三级栏目二')
    *      )
    */
    public function init ($arr = array(), $name = '根栏目') {
        $this->arr = $arr;
        $this->ret = '';
        $this->pid = isset($this->pid) ? $this->pid : 'parentid';
        $this->cid = isset($this->cid) ? $this->cid : 'cid';
        $this->name = isset($this->name) ? $this->name : 'name';
        //对数组数据修正-》增加根栏目
        array_unshift($this->arr, array($this->cid => 0,$this->name => $name,$this->pid => '-1'));
        return is_array($arr);
    }

    /**
     * 得到父级栏目的数组
     * @param int $myid 当前栏目id
     * @return array 父级栏目数组
     */
    public function getParent ($myid) {
        $newArr = array();
        if (! isset($this->arr[$myid]))
            return false;
            // 当前栏目的父id
        $pid = $this->arr[$myid][$this->pid];
        if (is_array($this->arr)) {
            foreach ($this->arr as $id => $v) {
                if ($v[$this->cid] == $pid)
                    $newArr[] = $v;
            }
        }
        return $newArr;
    }

    /**
     * 得到下级栏目的信息数组
     * @param int $myid 当前栏目id
     * @return array 子级栏目数组
     */
    public function getChild ($myid) {
        $v = $newArr = array();
        if (is_array($this->arr)) {
            foreach ($this->arr as $id => $v) {
                if ($v[$this->pid] == $myid)
                    $newArr[] = $v;
            }
        }
        return $newArr ? $newArr : false;
    }

    /**
     * 获取下级分类id集合数组
     * @param int $myid 当前栏目id
     * @param boolen $includeself 是否包含当前栏目id
     * @return array 子级栏目id数组
     */
    public function getChildId ($myid, $includeself = true) {
        // 判断是否包含当前栏目id
        if ($includeself)
            $newArr[] = $myid;
        else
            $newArr = array();
            // 获取下级栏目id集合
        if (is_array($this->arr)) {
            foreach ($this->arr as $id => $v) {
                if ($v[$this->pid] == $myid)
                    $newArr[] = $v[$this->cid];
            }
        }
        return $newArr ? $newArr : false;
    }

    /**
     * 获取当前栏目的位置数组
     * @param int $myid         当前栏目id
     * @param array $newArr     返回数组
     * 用法:
     * $position=array();
     * $tree->getPosition(10,$position);
     * p($position);    
     */
    public function getPosition ($myid, &$newArr) {
        $a = array();
        // 数据合法性验证
        if (! isset($this->arr[$myid]))
            return false;
        
        $newArr[] = $this->arr[$myid];
        $pid = $this->arr[$myid][$this->pid];
        
        // 递归获取上级数据
        if (isset($this->arr[$pid]))
            $this->getPosition($pid, $newArr);
        
        if (is_array($newArr)) {
            krsort($newArr);
            foreach ($newArr as $v) {
                $a[$v['id']] = $v;
            }
        }
        return $a;
    }

    /**
     * 获取某个栏目下栏目数组列表 
     * @param int $sid            父级栏目id
     * @param int $level          下级栏目级别 1为一层下级栏目
     * @param string $fieldname   数组下级栏目下标名
     * @param int $nowlevel       当前栏目级别
     */
    public function getList ($sid, $level = 1, $fieldname = 'child', $nowlevel = 0) {
        $newArray = $this->getChild($sid);
        if (is_array($newArray)) {
            ++ $nowlevel;
            foreach ($newArray as $id => $value) {
                $tmp = $this->getChild($value[$this->cid]);
                if ($nowlevel > $level)
                    $newArray[$id][$fieldname] = $tmp;
                else {
                    foreach ($tmp as $k => $v) {
                        $tmp[$k][$fieldname] = $this->getList($v[$this->cid], $level, $fieldname, $nowlevel);
                    }
                    $newArray[$id][$fieldname] = $tmp;
                }
            }
        }
        return $newArray;
    }

    /**
     * 得到树形结构
     * @param int $sid 初始栏目id  (-1 为从根目录开始)
     * @param string $treeStr 生成的结构形式 
     *        支持参数列表:
     *            {cid} 当前条目cid  对应于传入数组的下标
     *            {name} 当前条目name  对应于传入数组的下标
     *            {url}  当前条目url  对应于传入数组的下标
     *            {spacer} 分隔符位置
     *            {selected=***} 选中样式
     *        例如
     *            




分享本文到:
除非特殊注明,本文版权归原作者所有,欢迎转载!转载请注明版权以及本文地址,谢谢。
转载保留版权:Pakey's BLog >>开发框架 >>近期写的一个无限极分类树状输出控制类
本文地址:http://www.pakey.net/blog/category-tree-class.html