工作几年,一直用这用处理无限分类,这个类不是我写的,希望作者来认领,有时也要扩展一些方法。但基础方法已经足够了class Tree
{
    public $data=array();
    public $cateArray=array();    function Tree()
    {    }
    function setNode ($id, $parent, $value)
    {
    $parent = $parent?$parent:0;
    $this->data[$id] = $value;
    $this->cateArray[$id] = $parent;
    }
    function getChildsTree($id=0)
    {
    $childs=array();
    foreach ($this->cateArray as $child=>$parent)
    {
    if ($parent==$id)
    {
     $childs[$child]=$this->getChildsTree($child);
    }
    }
    return $childs;
    }
    function getParentsTree($id=0)
    {
    $parents=array();
    foreach ($this->cateArray as $child=>$parent)
    {
    if ($child ==$id)
    {
     $parents[$parent]=$this->getParentsTree($parent);
    }
    }
    return $parents;
    }
    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;
    }
    
    function getChild($id)
    {
    $childs=array();
    foreach ($this->cateArray as $child=>$parent)
    {
    if ($parent==$id)
    {
     $childs[$child]=$child;
    }
    }
    return $childs;
    }
    
    function getParents($id)
    {
    $parentArray=array();
    $parents=$this->getParent($id);
    foreach ($parents as $parent)
    {
    $parentArray[]=$parent;
    $parentArray=array_merge($parentArray,$this->getParents($parent));
    }
    return $parentArray;
    }
    
    function getParent($id)
    {
    $parents=array();
    foreach ($this->cateArray as $child=>$parent)
    {
    if ($child==$id)
    {
     $parents[$parent]=$parent;
    }
    }
    return $parents;
    }
    //单线获取父节点
    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;
    }
    function getLayer($id,$preStr='|-')
    {
     return str_repeat($preStr,count($this->getNodeLever($id)));
    }
    function getValue ($id)
    {
     return $this->data[$id];
    } // end func
}

解决方案 »

  1.   

    =&  这个是运算符?
      

  2.   

    =&  这个是运算符? 
      

  3.   

    版主大哥~~再把你这个输出的树状数组转成以ID排序的二维数组呢?
    Array([1]=>([id] => 1
                 [pid] => 0
                 [title] => Food),
         [2]=>]=>([id] => 2
                 [pid] => 0
                 [title] => Fruit),.....................