欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

用于生成一个表格树

程序员文章站 2022-04-14 15:57:31
...
生成的例子如下:

好吧,不知道要怎么上传图片。。。
<?php
 
/**
 * 树形展示
 * #-------------------------------#
 * #   a   | b | c | d | e | f | g #
 * #-------------------------------#
 * #  a-1  |   |   |   |   |   |   #
 * #-------|   |   |   |   |   |   #
 * #a-2|a-3|   |   |   |   |   |   #
 * #-------------------------------#
 * and open the template in the editor.
 *
 * PHP version 5.3.8
 *
 * @category TreeTable
 * @package  Tree
 * @author   然 <384750321@qq.com>
 *
 */
 
/**
 * 生成表格树
 *
 * PHP version 5.3.8
 *
 * @author 然 <384750321@qq.com>
 */
class TreeTableCross
{
 
    private $_arr, $_rows;
 
    /**
     * 初始化TreeTable数据
     * @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'=>'三级栏目二')
     *      )
     */
    public function init($arr)
    {
        if (!is_array($arr)) {
            return false;
        }
        $this->_arr = $arr;
        $this->get_allChilds();
        $this->get_allParent();
        $this->get_depth();
        $this->get_max();
    }
 
    /**
     * 获取最深的树
     *
     */
    public function get_depth()
    {
        $depth = 0;
        foreach ($this->_arr as $k => $v) {
            if ($v['arrparentids']) {
                $v['depth'] = count(explode(',', $v['arrparentids'])) + 1;
                if ($v['depth'] > $depth) {
                    $depth = $v['depth'];
                }
            } else {
                $v['depth'] = 1;
            }
            $this->_arr[$k] = $v;
        }
        $this->_rows = $depth;
    }
 
    /**
     * 获取每个id的最广树
     */
    public function get_max()
    {
        foreach ($this->_arr as $id => $v) {
            $_arr = $this->_arr[$id];
            $depth = array();
            $num = 0;
            // 获取id的最低级的所有节点,根据行数排序
            if ($_arr['arrchildids']) {
                $arrchildids = explode(',', $_arr['arrchildids']);
                foreach ($arrchildids as $v) {
                    if (!$this->_arr[$v]['childids']) {
                        $depth[$this->_arr[$v]['depth']][$v] = $v;
                    }
                }
            } else {
                $depth[$_arr['depth']][$id] = $id;
            }
            ksort($depth);
            foreach ($depth as $k => $v) {
                $count = count($v);
                $num += $count;
            }
            $this->_arr[$id]['max'] = $num;
        }
    }
 
    /**
     * 根据ID获取所有的父级
     *
     * @param type $id
     * @return type
     */
    public function get_parent($id)
    {
        $arrparents = array();
        $parentid = $this->_arr[$id]['parentid'];
        while ($parentid) {
            $arrparents[$parentid] = $this->_arr[$parentid];
            $parentid = $this->_arr[$parentid]['parentid'];
        }
        return $arrparents;
    }
 
    /**
     * 获取所有的父级
     *
     * @return type
     */
    public function get_allParent()
    {
        $arrparents = array();
        foreach ($this->_arr as $k => $v) {
            $parentid = $v['parentid'];
            // 循环出所有的父级
            if ($parentid) {
                while ($parentid) {
                    $arrparents[$k][$parentid] = $v;
                    $parentid = $this->_arr[$parentid]['parentid'];
                }
            }
        }
        foreach ($arrparents as $k => $v) {
            ksort($v);
            $this->_arr[$k]['arrparentids'] = implode(',', array_keys($v));
        }
    }
 
    /**
     * 根据ID获取二级子级
     *
     * @param type $id
     * @return type
     */
    public function get_childs($id)
    {
        $childs = array();
        if (is_array($this->_arr)) {
            foreach ($this->_arr as $k => $v) {
                if ($v['parentid'] == $id) {
                    $childs[$k] = $v;
                }
            }
        }
        return $childs;
    }
 
    /**
     * 获取所有的子集
     *
     * @return type
     */
    public function get_allChilds()
    {
        $childs = array();
        foreach ($this->_arr as $k => $v) {
            if ($v['parentid'] === 0) {
                $childs[$k][$k] = $v;
            } else {
                // 循环判断父级所存在的数组,并把id加入到父级存在的数组中
                if ($childs) {
                    foreach ($childs as $ck => $cv) {
                        if (array_key_exists($v['parentid'], $cv)) {
                            $childs[$ck][$k] = $v;
                        }
                    }
                }
                $childs[$v['parentid']][$k] = $v;
            }
        }
        foreach ($childs as $k => $v) {
            ksort($v);
            // 取出本身id
            unset($v[$k]);
            if ($v) {
                $this->_arr[$k]['arrchildids'] = implode(',', array_keys($v));
            }
        }
        // 获取二级id
        foreach ($this->_arr as $k => $v) {
            if ($childids = array_keys($this->get_childs($k))) {
                $this->_arr[$k]['childids'] = implode(',', $childids);
            }
        }
    }
 
    public function get_tableTree()
    {
        $_arr = array();
        $str = '';
        $_save_childs = array();
        // 整理出对应的行数
        foreach ($this->_arr as $k => $v) {
            $_arr[$v['depth']][$k] = $v;
        }
        ksort($_arr);
        // 循环行数
        for ($i = 1; $i <= $this->_rows; $i++) {
            $str .= '<tr>';
            // 对于第二行数据的排序显示,避免数据错乱
            if ($_save_childs) {
                $_save_childs_back = $_save_childs;
                $_save_childs = array();
                // 对于上次循环数据的对应
                foreach ($_save_childs_back as $sk => $sv) {
                    $sv = array_intersect_key($_arr[$i], array_flip($sv));
                    if ($sv) {
                        foreach ($sv as $k => $v) {
                            $value = $v;
                            $_save_childs[$k] = explode(',', $value['arrchildids']);
                            $str .= "<td width='100px' colspan='{$value['max']}'>{$value['name']}</td>";
                        }
                    } else {
                        // 计算需要合并的行数
                        $rows = $this->_rows - $i + 1;
                        $str .= "<td width='100px' rowspan='{$rows}'></td>";
                    }
                }
            } else {
                foreach ($_arr[$i] as $k => $v) {
                    if ($v['arrchildids']) {
                        $_save_childs[$k] = explode(',', $v['arrchildids']);
                    } else {
                        // 计算需要合并的行数
                        $rows = $this->_rows - $i + 1;
                    }
                    $str .= "<td width='100px' colspan='{$v['max']}' rowspan='{$rows}';>{$v['name']}</td>";
                }
            }
            $str .= '</tr>';
        }
        return $str;
    }
 
}
 
$treearr = array(
    1 => array('id' => '1', 'parentid' => 0, 'name' => '1'),
    2 => array('id' => '2', 'parentid' => 0, 'name' => '2'),
    3 => array('id' => '3', 'parentid' => 1, 'name' => '3'),
    4 => array('id' => '4', 'parentid' => 1, 'name' => '4'),
    5 => array('id' => '5', 'parentid' => 1, 'name' => '5'),
    6 => array('id' => '6', 'parentid' => 0, 'name' => '6'),
);
$treeTable = new TreeTableCross();
$treeTable->init($treearr);
echo $treeTable->get_tableTree();
?>

以上就是用于生成一个表格树的内容,更多相关内容请关注PHP中文网(www.php.cn)!

相关标签: 表格树