You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

444 lines
14 KiB

<?php
namespace library;
class Tree
{
/**
* 内容数组
* @var array
*/
public $data = array();
/**
* 节点数组
* @var array
*/
public $cateArray = array();
public $res = array();
public function __construct($arr = array())
{
$this->data = $arr;
$this->res = '';
return is_array($arr);
}
public function setNode($id, $value, $parent = 0)
{
$this->data[$id] = $value;
$this->cateArray[$id] = $parent;
}
public function getAllChildrenNodes($id = 0,\Closure $compFunc = null,\Closure $retFunc = null)
{
$result = [];
$children = array_keys($this->cateArray, $id);
if ($id > 0 && $compFunc && $compFunc($this->data[$id])) {
$result = $retFunc === null ? $id : $retFunc($this->data[$id]);
} else if (count($children) > 0) {
foreach ($children as $child) {
$result = array_merge($result, $this->getAllChildrenNodes($child, $compFunc, $retFunc));
}
} else {
$result = $retFunc === null ? $id: $retFunc($this->data[$id]);
}
return $result;
}
public function getChildsTree($id = 0)
{
$childs = array();
foreach ($this->cateArray as $child => $parent) {
if ($parent == $id) {
$childs[$child] = $this->getChildsTree($child);
}
}
return $childs;
}
public function getParentsTree($id = 0)
{
$parents = array();
foreach ($this->cateArray as $child => $parent) {
if ($child == $id) {
$parents[$parent] = $this->getParentsTree($parent);
}
}
return $parents;
}
public function getChilds($id = 0)
{
$childArray = array();
$childs = $this->getChild($id);
foreach ($childs as $child) {
$childArray[] = $child;
$childArray = array_merge($childArray, $this->getChilds($child));
}
return $childArray;
}
public function getChild($id)
{
$childs = array();
foreach ($this->cateArray as $child => $parent) {
if ($parent == $id) {
$childs[$child] = $child;
}
}
return $childs;
}
public function getParents($id)
{
$parentArray = array();
$parents = $this->getParent($id);
foreach ($parents as $parent) {
$parentArray[] = $parent;
$parentArray = array_merge($parentArray, $this->getParents($parent));
}
return $parentArray;
}
public function getParent($id)
{
$parents = array();
foreach ($this->cateArray as $child => $parent) {
if ($child == $id) {
$parents[$parent] = $parent;
}
}
return $parents;
}
//单线获取父节点
public function getNodeLever($id)
{
$parents = array();
if (key_exists($this->cateArray[$id], $this->cateArray)) {
$parents[] = $this->cateArray[$id];
$parents = array_merge($parents, $this->getNodeLever($this->cateArray[$id]));
}
return $parents;
}
public function getLayer($id, $preStr = '|-')
{
return str_repeat($preStr, count($this->getNodeLever($id)));
}
public function getValue($id)
{
return $this->data[$id];
}
//获取所有节点数据生成树
public function getTreeShow($id = 0, $str = "|-")
{
if ($id != 0) {
$str = $str . "|-";
}
//遍历所有数组检查parent是否有id
foreach ($this->cateArray as $child => $parent) {
//检查是否有相等的ID
if ($parent == $id) {
$showname = $this->getValue($child);
if(is_string($showname)){
$this->res[$child] = $str . $showname;
}else if(is_array($showname) && isset($showname['name'])){
$this->res[$child] = $str . $showname['name'];
}else {
$this->res[$child] = $str . $child;
}
$this->getTreeShow($child, $str);
}
}
}
}
//class Tree
//{
// /**
// * 生成树型结构所需要的2维数组
// * @var array
// */
// public $arr = array();
//
// /**
// * 生成树型结构所需修饰符号,可以换成图片
// * @var array
// */
// public $icon = array('│', '├', '└');
// public $nbsp = " ";
//
// /**
// * @access private
// */
// public $ret = '';
//
// /**
// * 构造函数,初始化类
// * @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 = array())
// {
// $this->arr = $arr;
// $this->ret = '';
// return is_array($arr);
// }
//
// /**
// * 得到父级数组
// * @param int
// * @return array
// */
// public function get_parent($myid)
// {
// $newarr = array();
// if (!isset($this->arr[$myid])) return false;
// $pid = $this->arr[$myid]['parentid'];
// $pid = $this->arr[$pid]['parentid'];
// if (is_array($this->arr)) {
// foreach ($this->arr as $id => $a) {
// if ($a['parentid'] == $pid) $newarr[$id] = $a;
// }
// }
// return $newarr;
// }
//
// /**
// * 得到子级数组
// * @param int
// * @return array
// */
// public function get_child($myid)
// {
// $a = $newarr = array();
// if (is_array($this->arr)) {
// foreach ($this->arr as $id => $a) {
// if ($a['parentid'] == $myid) $newarr[$id] = $a;
// }
// }
// return $newarr ? $newarr : false;
// }
//
// /**
// * 得到当前位置数组
// * @param int
// * @return array
// */
// public function get_pos($myid, &$newarr)
// {
// $a = array();
// if (!isset($this->arr[$myid])) return false;
// $newarr[] = $this->arr[$myid];
// $pid = $this->arr[$myid]['parentid'];
// if (isset($this->arr[$pid])) {
// $this->get_pos($pid, $newarr);
// }
// if (is_array($newarr)) {
// krsort($newarr);
// foreach ($newarr as $v) {
// $a[$v['id']] = $v;
// }
// }
// return $a;
// }
//
// /**
// * 得到树型结构
// * @param int ID,表示获得这个ID下的所有子级
// * @param string 生成树型结构的基本代码,例如:"<option value=\$id \$selected>\$spacer\$name</option>"
// * @param int 被选中的ID,比如在做树型下拉框的时候需要用到
// * @return string
// */
// public function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = '')
// {
// $number = 1;
// $child = $this->get_child($myid);
// if (is_array($child)) {
// $total = count($child);
// foreach ($child as $id => $value) {
// $j = $k = '';
// if ($number == $total) {
// $j .= $this->icon[2];
// } else {
// $j .= $this->icon[1];
// $k = $adds ? $this->icon[0] : '';
// }
// $spacer = $adds ? $adds . $j : '';
// $selected = $id == $sid ? 'selected' : '';
// @extract($value);
// $parentid == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";");
// $this->ret .= $nstr;
// $nbsp = $this->nbsp;
// $this->get_tree($id, $str, $sid, $adds . $k . $nbsp, $str_group);
// $number++;
// }
// }
// return $this->ret;
// }
//
// /**
// * 同上一方法类似,但允许多选
// */
// public function get_tree_multi($myid, $str, $sid = 0, $adds = '')
// {
// $number = 1;
// $child = $this->get_child($myid);
// if (is_array($child)) {
// $total = count($child);
// foreach ($child as $id => $a) {
// $j = $k = '';
// if ($number == $total) {
// $j .= $this->icon[2];
// } else {
// $j .= $this->icon[1];
// $k = $adds ? $this->icon[0] : '';
// }
// $spacer = $adds ? $adds . $j : '';
//
// $selected = $this->have($sid, $id) ? 'selected' : '';
// @extract($a);
// eval("\$nstr = \"$str\";");
// $this->ret .= $nstr;
// $this->get_tree_multi($id, $str, $sid, $adds . $k . ' ');
// $number++;
// }
// }
// return $this->ret;
// }
//
// /**
// * @param integer $myid 要查询的ID
// * @param string $str 第一种HTML代码方式
// * @param string $str2 第二种HTML代码方式
// * @param integer $sid 默认选中
// * @param integer $adds 前缀
// */
// public function get_tree_category($myid, $str, $str2, $sid = 0, $adds = '')
// {
// $number = 1;
// $child = $this->get_child($myid);
// if (is_array($child)) {
// $total = count($child);
// foreach ($child as $id => $a) {
// $j = $k = '';
// if ($number == $total) {
// $j .= $this->icon[2];
// } else {
// $j .= $this->icon[1];
// $k = $adds ? $this->icon[0] : '';
// }
// $spacer = $adds ? $adds . $j : '';
//
// $selected = $this->have($sid, $id) ? 'selected' : '';
// @extract($a);
// if (empty($html_disabled)) {
// eval("\$nstr = \"$str\";");
// } else {
// eval("\$nstr = \"$str2\";");
// }
// $this->ret .= $nstr;
// $this->get_tree_category($id, $str, $str2, $sid, $adds . $k . ' ');
// $number++;
// }
// }
// return $this->ret;
// }
//
// /**
// * 同上一类方法,jquery treeview 风格,可伸缩样式(需要treeview插件支持)
// * @param $myid 表示获得这个ID下的所有子级
// * @param $effected_id 需要生成treeview目录数的id
// * @param $str 末级样式
// * @param $str2 目录级别样式
// * @param $showlevel 直接显示层级数,其余为异步显示,0为全部限制
// * @param $style 目录样式 默认 filetree 可增加其他样式如'filetree treeview-famfamfam'
// * @param $currentlevel 计算当前层级,递归使用 适用改函数时不需要用该参数
// * @param $recursion 递归使用 外部调用时为FALSE
// */
// function get_treeview($myid, $effected_id = 'example', $str = "<span class='file'>\$name</span>", $str2 = "<span class='folder'>\$name</span>", $showlevel = 0, $style = 'filetree ', $currentlevel = 1, $recursion = FALSE)
// {
// $child = $this->get_child($myid);
// if (!defined('EFFECTED_INIT')) {
// $effected = ' id="' . $effected_id . '"';
// define('EFFECTED_INIT', 1);
// } else {
// $effected = '';
// }
// $placeholder = '<ul><li><span class="placeholder"></span></li></ul>';
// if (!$recursion) $this->str .= '<ul' . $effected . ' class="' . $style . '">';
// foreach ($child as $id => $a) {
//
// @extract($a);
// if ($showlevel > 0 && $showlevel == $currentlevel && $this->get_child($id)) $folder = 'hasChildren'; //如设置显示层级模式@2011.07.01
// $floder_status = isset($folder) ? ' class="' . $folder . '"' : '';
// $this->str .= $recursion ? '<ul><li' . $floder_status . ' id=\'' . $id . '\'>' : '<li' . $floder_status . ' id=\'' . $id . '\'>';
// $recursion = FALSE;
// if ($this->get_child($id)) {
// eval("\$nstr = \"$str2\";");
// $this->str .= $nstr;
// if ($showlevel == 0 || ($showlevel > 0 && $showlevel > $currentlevel)) {
// $this->get_treeview($id, $effected_id, $str, $str2, $showlevel, $style, $currentlevel + 1, TRUE);
// } elseif ($showlevel > 0 && $showlevel == $currentlevel) {
// $this->str .= $placeholder;
// }
// } else {
// eval("\$nstr = \"$str\";");
// $this->str .= $nstr;
// }
// $this->str .= $recursion ? '</li></ul>' : '</li>';
// }
// if (!$recursion) $this->str .= '</ul>';
// return $this->str;
// }
//
// /**
// * 获取子栏目json
// * Enter description here ...
// * @param unknown_type $myid
// */
// public function creat_sub_json($myid, $str = '')
// {
// $sub_cats = $this->get_child($myid);
// $n = 0;
// if (is_array($sub_cats)) foreach ($sub_cats as $c) {
// $data[$n]['id'] = iconv(CHARSET, 'utf-8', $c['catid']);
// if ($this->get_child($c['catid'])) {
// $data[$n]['liclass'] = 'hasChildren';
// $data[$n]['children'] = array(array('text' => ' ', 'classes' => 'placeholder'));
// $data[$n]['classes'] = 'folder';
// $data[$n]['text'] = iconv(CHARSET, 'utf-8', $c['catname']);
// } else {
// if ($str) {
// @extract(array_iconv($c, CHARSET, 'utf-8'));
// eval("\$data[$n]['text'] = \"$str\";");
// } else {
// $data[$n]['text'] = iconv(CHARSET, 'utf-8', $c['catname']);
// }
// }
// $n++;
// }
// return json_encode($data);
// }
//
// private function have($list, $item)
// {
// return (strpos(',,' . $list . ',', ',' . $item . ','));
// }
//}