<?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)!