* */ /** * 生成表格树 * * PHP version 5.3.8 * * @author 然 <384750321@qq.com> */ class TreeTableCross { private $_arr, $_rows; /** * 初始化TreeTable数据 * @param array 2维数组 * array( * 1 => array(&#39;id&#39;=>&#39;1&#39;,&#39;parentid&#39;=>0,&#39;name&#39;=>&#39;一级栏目一&#39;), * 2 => array(&#39;id&#39;=>&#39;2&#39;,&#39;parentid&#39;=>0,&#39;name&#39;=>&#39;一级栏目二&#39;), * 3 => array(&#39;id&#39;=>&#39;3&#39;,&#39;parentid&#39;=>1,&#39;name&#39;=>&#39;二级栏目一&#39;), * 4 => array(&#39;id&#39;=>&#39;4&#39;,&#39;parentid&#39;=>1,&#39;name&#39;=>&#39;二级栏目二&#39;), * 5 => array(&#39;id&#39;=>&#39;5&#39;,&#39;parentid&#39;=>2,&#39;name&#39;=>&#39;二级栏目三&#39;), * 6 => array(&#39;id&#39;=>&#39;6&#39;,&#39;parentid&#39;=>3,&#39;name&#39;=>&#39;三级栏目一&#39;), * 7 => array(&#39;id&#39;=>&#39;7&#39;,&#39;parentid&#39;=>3,&#39;name&#39;=>&#39;三级栏目二&#39;) * ) */ 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[&#39;arrparentids&#39;]) { $v[&#39;depth&#39;] = count(explode(&#39;,&#39;, $v[&#39;arrparentids&#39;])) + 1; if ($v[&#39;depth&#39;] > $depth) { $depth = $v[&#39;depth&#39;]; } } else { $v[&#39;depth&#39;] = 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[&#39;arrchildids&#39;]) { $arrchildids = explode(&#39;,&#39;, $_arr[&#39;arrchildids&#39;]); foreach ($arrchildids as $v) { if (!$this->_arr[$v][&#39;childids&#39;]) { $depth[$this->_arr[$v][&#39;depth&#39;]][$v] = $v; } } } else { $depth[$_arr[&#39;depth&#39;]][$id] = $id; } ksort($depth); foreach ($depth as $k => $v) { $count = count($v); $num += $count; } $this->_arr[$id][&#39;max&#39;] = $num; } } /** * 根据ID获取所有的父级 * * @param type $id * @return type */ public function get_parent($id) { $arrparents = array(); $parentid = $this->_arr[$id][&#39;parentid&#39;]; while ($parentid) { $arrparents[$parentid] = $this->_arr[$parentid]; $parentid = $this->_arr[$parentid][&#39;parentid&#39;]; } return $arrparents; } /** * 获取所有的父级 * * @return type */ public function get_allParent() { $arrparents = array(); foreach ($this->_arr as $k => $v) { $parentid = $v[&#39;parentid&#39;]; // 循环出所有的父级 if ($parentid) { while ($parentid) { $arrparents[$k][$parentid] = $v; $parentid = $this->_arr[$parentid][&#39;parentid&#39;]; } } } foreach ($arrparents as $k => $v) { ksort($v); $this->_arr[$k][&#39;arrparentids&#39;] = implode(&#39;,&#39;, 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[&#39;parentid&#39;] == $id) { $childs[$k] = $v; } } } return $childs; } /** * 获取所有的子集 * * @return type */ public function get_allChilds() { $childs = array(); foreach ($this->_arr as $k => $v) { if ($v[&#39;parentid&#39;] === 0) { $childs[$k][$k] = $v; } else { // 循环判断父级所存在的数组,并把id加入到父级存在的数组中 if ($childs) { foreach ($childs as $ck => $cv) { if (array_key_exists($v[&#39;parentid&#39;], $cv)) { $childs[$ck][$k] = $v; } } } $childs[$v[&#39;parentid&#39;]][$k] = $v; } } foreach ($childs as $k => $v) { ksort($v); // 取出本身id unset($v[$k]); if ($v) { $this->_arr[$k][&#39;arrchildids&#39;] = implode(&#39;,&#39;, array_keys($v)); } } // 获取二级id foreach ($this->_arr as $k => $v) { if ($childids = array_keys($this->get_childs($k))) { $this->_arr[$k][&#39;childids&#39;] = implode(&#39;,&#39;, $childids); } } } public function get_tableTree() { $_arr = array(); $str = &#39;&#39;; $_save_childs = array(); // 整理出对应的行数 foreach ($this->_arr as $k => $v) { $_arr[$v[&#39;depth&#39;]][$k] = $v; } ksort($_arr); // 循环行数 for ($i = 1; $i <= $this->_rows; $i++) { $str .= &#39;&#39;; // 对于第二行数据的排序显示,避免数据错乱 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(&#39;,&#39;, $value[&#39;arrchildids&#39;]); $str .= " &#39;; } return $str; } } $treearr = array( 1 => array(&#39;id&#39; => &#39;1&#39;, &#39;parentid&#39; => 0, &#39;name&#39; => &#39;1&#39;), 2 => array(&#39;id&#39; => &#39;2&#39;, &#39;parentid&#39; => 0, &#39;name&#39; => &#39;2&#39;), 3 => array(&#39;id&#39; => &#39;3&#39;, &#39;parentid&#39; => 1, &#39;name&#39; => &#39;3&#39;), 4 => array(&#39;id&#39; => &#39;4&#39;, &#39;parentid&#39; => 1, &#39;name&#39; => &#39;4&#39;), 5 => array(&#39;id&#39; => &#39;5&#39;, &#39;parentid&#39; => 1, &#39;name&#39; => &#39;5&#39;), 6 => array(&#39;id&#39; => &#39;6&#39;, &#39;parentid&#39; => 0, &#39;name&#39; => &#39;6&#39;), ); $treeTable = new TreeTableCross(); $treeTable->init($treearr); echo $treeTable->get_tableTree(); ?>{$value[&#39;name&#39;]} "; } } else { // 计算需要合并的行数 $rows = $this->_rows - $i + 1; $str .= ""; } } } else { foreach ($_arr[$i] as $k => $v) { if ($v[&#39;arrchildids&#39;]) { $_save_childs[$k] = explode(&#39;,&#39;, $v[&#39;arrchildids&#39;]); } else { // 计算需要合并的行数 $rows = $this->_rows - $i + 1; } $str .= " {$v[&#39;name&#39;]} "; } } $str .= &#39;
以上就是用于生成一个表格树的内容,更多相关内容请关注PHP中文网(www.php1.cn)!