[php]一个php无限分类
<?php
class Tree
{
//分层
private $data=array();//id=>信息
private $cateArray=array();//id=>pid
public function __construct($dataArray)
{
foreach ($dataArray as $val)
{
$this->setNode($val['id'], $val['pid'], $val['data']);
}
$this->sortASC();
}
//设置树的节点
function setNode($id, $parent, $value)
{
$parent = $parent?$parent:0;
$this->data[$id] = $value;
$this->cateArray[$id] = $parent;
}
/*
* 递归实现
* 得到id下的子树结构数组(用多维数组格式来表示树)
* id Internet 节点id (0表示的是根节点,是虚拟的,即没有与它对应的实际信息)
* return array 子树节点数组
*/
function getChildsTree($id=0)
{
$childs=array();
foreach ($this->cateArray as $child=>$parent)
{
if ($parent==$id)
{
$childs[$child]=$this->getChildsTree($child);
}
}
return $childs;
}
/*
* 递归实现
* 得到id节点的所有后代节点
* $id
* return array 索引=>id,...一维数组(顺序important)
*/
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;
}
/*
* 得到id节点的孩子节点
* $id
* return array 索引=>id,...一维数组
*/
function getChild($id)
{
$childs=array();
foreach ($this->cateArray as $child=>$parent)
{
if ($parent==$id)
{
$childs[]=$child;
}
}
return $childs;
}
/*
* 递归实现
* 反线获得节点id的父节点
* $id interger 不可以为0
* return array 其父节点数组
*/
function getNodeLever($id)
{
$parents=array();
if (array_key_exists($this->cateArray[$id],$this->cateArray))//它的父节点,在节点树中
{
$parents[]=$this->cateArray[$id];
$parents=array_merge($parents,$this->getNodeLever($this->cateArray[$id]));
}
return $parents;
}
/*
* 根据所在层数得到n-1个前导格式化符号
* $id Internet 不可以取0
* $preStr str 填充的格式化符号
* return str 多个格式化符号
*/
function getLayer($id,$preStr='|-')
{
return str_repeat($preStr,count($this->getNodeLever($id)));
}
//得到id节点的信息
function getValue ($id)
{
return $this->data[$id];
}
/*
* id降序
*/
function sortDES()
{
krsort($this->cateArray);
}
/*
* id升序
*/
function sortASC()
{
ksort($this->cateArray);
}
//显示
function display()
{
$category = $this->getChilds(0);
foreach ($category as $key=>$id)
{
echo $id.$this->getLayer($id, '|-').$this->getValue($id)."\n";
}
}
//endallfunc所有函数结束
}
$data = array(
array('id'=>3, 'pid'=>0, 'data'=>'目录0-3'),
array('id'=>2, 'pid'=>1, 'data'=>'目录1-2'),
array('id'=>5, 'pid'=>3, 'data'=>'目录3-5'),
array('id'=>1, 'pid'=>0, 'data'=>'目录0-1'),
array('id'=>4, 'pid'=>2, 'data'=>'目录2-4'),
array('id'=>9, 'pid'=>4, 'data'=>'目录4-9'),
array('id'=>6, 'pid'=>2, 'data'=>'目录2-6'),
array('id'=>7, 'pid'=>2, 'data'=>'目录2-7'),
array('id'=>8, 'pid'=>3, 'data'=>'目录3-8'),
);
$Tree = new Tree($data);
//0(1(2(4(9)67))3(58))
//print_r($Tree->getChildsTree(0));
//print_r($Tree->getChild(0));
//print_r($Tree->getChilds(0));
//print_r($Tree->getNodeLever(4));
//print_r($Tree->getLayer(4));
$Tree->display();
?>
class Tree
{
//分层
private $data=array();//id=>信息
private $cateArray=array();//id=>pid
public function __construct($dataArray)
{
foreach ($dataArray as $val)
{
$this->setNode($val['id'], $val['pid'], $val['data']);
}
$this->sortASC();
}
//设置树的节点
function setNode($id, $parent, $value)
{
$parent = $parent?$parent:0;
$this->data[$id] = $value;
$this->cateArray[$id] = $parent;
}
/*
* 递归实现
* 得到id下的子树结构数组(用多维数组格式来表示树)
* id Internet 节点id (0表示的是根节点,是虚拟的,即没有与它对应的实际信息)
* return array 子树节点数组
*/
function getChildsTree($id=0)
{
$childs=array();
foreach ($this->cateArray as $child=>$parent)
{
if ($parent==$id)
{
$childs[$child]=$this->getChildsTree($child);
}
}
return $childs;
}
/*
* 递归实现
* 得到id节点的所有后代节点
* $id
* return array 索引=>id,...一维数组(顺序important)
*/
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;
}
/*
* 得到id节点的孩子节点
* $id
* return array 索引=>id,...一维数组
*/
function getChild($id)
{
$childs=array();
foreach ($this->cateArray as $child=>$parent)
{
if ($parent==$id)
{
$childs[]=$child;
}
}
return $childs;
}
/*
* 递归实现
* 反线获得节点id的父节点
* $id interger 不可以为0
* return array 其父节点数组
*/
function getNodeLever($id)
{
$parents=array();
if (array_key_exists($this->cateArray[$id],$this->cateArray))//它的父节点,在节点树中
{
$parents[]=$this->cateArray[$id];
$parents=array_merge($parents,$this->getNodeLever($this->cateArray[$id]));
}
return $parents;
}
/*
* 根据所在层数得到n-1个前导格式化符号
* $id Internet 不可以取0
* $preStr str 填充的格式化符号
* return str 多个格式化符号
*/
function getLayer($id,$preStr='|-')
{
return str_repeat($preStr,count($this->getNodeLever($id)));
}
//得到id节点的信息
function getValue ($id)
{
return $this->data[$id];
}
/*
* id降序
*/
function sortDES()
{
krsort($this->cateArray);
}
/*
* id升序
*/
function sortASC()
{
ksort($this->cateArray);
}
//显示
function display()
{
$category = $this->getChilds(0);
foreach ($category as $key=>$id)
{
echo $id.$this->getLayer($id, '|-').$this->getValue($id)."\n";
}
}
//endallfunc所有函数结束
}
$data = array(
array('id'=>3, 'pid'=>0, 'data'=>'目录0-3'),
array('id'=>2, 'pid'=>1, 'data'=>'目录1-2'),
array('id'=>5, 'pid'=>3, 'data'=>'目录3-5'),
array('id'=>1, 'pid'=>0, 'data'=>'目录0-1'),
array('id'=>4, 'pid'=>2, 'data'=>'目录2-4'),
array('id'=>9, 'pid'=>4, 'data'=>'目录4-9'),
array('id'=>6, 'pid'=>2, 'data'=>'目录2-6'),
array('id'=>7, 'pid'=>2, 'data'=>'目录2-7'),
array('id'=>8, 'pid'=>3, 'data'=>'目录3-8'),
);
$Tree = new Tree($data);
//0(1(2(4(9)67))3(58))
//print_r($Tree->getChildsTree(0));
//print_r($Tree->getChild(0));
//print_r($Tree->getChilds(0));
//print_r($Tree->getNodeLever(4));
//print_r($Tree->getLayer(4));
$Tree->display();
?>

浙公网安备 33010602011771号