php 用于生成一个表格树
用于生成一个表格树 [代码片段(267行)]
<?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://outofmemory.cn
- 上一篇:php 用PHP求解最长公共子串问题
- 下一篇:php 数组数据转换为xml格式
精彩图集
精彩文章






