- <?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
- *
- */
- /**
- * 生成表格树
- *
- * PHP version 5.3.8
- */
- 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();
- ?>
- //该片段来自于http://www.codesnippet.cn/detail/130920135881.html
来源: http://www.codesnippet.cn/detail/130920135881.html