PHP代码:--------------------------------------------------------------------------------

<?php

/**
 * @author        YangHuan
 * @datetime   
 * @version        1.0.0
 
*/

/**
 * Short description.
 *
 * Detail description
 * @author      
 * @version      1.0
 * @copyright   
 * @access       public
 
*/
class Tree
{
    
/**
     * Description
     * @var      
     * @since     1.0
     * @access    private
     
*/
    
var $data    = array();
   
    
/**
     * Description
     * @var      
     * @since     1.0
     * @access    private
     
*/
    
var $child    = array(-1=>array());
   
    
/**
     * Description
     * @var      
     * @since     1.0
     * @access    private
     
*/
    
var $layer    = array(-1=>-1);
   
    
/**
     * Description
     * @var      
     * @since     1.0
     * @access    private
     
*/
    
var $parent    = array();

    
/**
     * Short description.
     *
     * Detail description
     * @param      none
     * @global     none
     * @since      1.0
     * @access     private
     * @return     void
     * @update     date time
    
*/
    
function Tree ($value)
    {
        
$this->setNode(0, -1, $value);
    } 
// end func

    
/**
     * Short description.
     *
     * Detail description
     * @param      none
     * @global     none
     * @since      1.0
     * @access     private
     * @return     void
     * @update     date time
    
*/
    
function setNode ($id, $parent, $value)
    {
        
$parent = $parent?$parent:0;

        
$this->data[$id]            = $value;
        
$this->child[$id]            = array();
        
$this->child[$parent][]        = $id;
        
$this->parent[$id]            = $parent;

        
if (!isset($this->layer[$parent]))
        {
            
$this->layer[$id= 0;
        }
        
else
        {
            
$this->layer[$id= $this->layer[$parent+ 1;
        }
    } 
// end func
   
    
/**
     * Short description.
     *
     * Detail description
     * @param      none
     * @global     none
     * @since      1.0
     * @access     private
     * @return     void
     * @update     date time
    
*/
    
function getList (&$tree, $root= 0)
    {
        
foreach ($this->child[$rootas $key=>$id)
        {
            
$tree[] = $id;

            
if ($this->child[$id]) $this->getList($tree, $id);
        }
    } 
// end func

    
/**
     * Short description.
     *
     * Detail description
     * @param      none
     * @global     none
     * @since      1.0
     * @access     private
     * @return     void
     * @update     date time
    
*/
    
function getValue ($id)
    {
        
return $this->data[$id];
    } 
// end func

    
/**
     * Short description.
     *
     * Detail description
     * @param      none
     * @global     none
     * @since      1.0
     * @access     private
     * @return     void
     * @update     date time
    
*/
    
function getLayer ($id, $space = false)
    {
        
return $space?str_repeat($space, $this->layer[$id]):$this->layer[$id];
    } 
// end func

    
/**
     * Short description.
     *
     * Detail description
     * @param      none
     * @global     none
     * @since      1.0
     * @access     private
     * @return     void
     * @update     date time
    
*/
    
function getParent ($id)
    {
        
return $this->parent[$id];
    } 
// end func
   
    
/**
     * Short description.
     *
     * Detail description
     * @param      none
     * @global     none
     * @since      1.0
     * @access     private
     * @return     void
     * @update     date time
    
*/
    
function getParents ($id)
    {
        
while ($this->parent[$id!= -1)
        {
            
$id = $parent[$this->layer[$id]] = $this->parent[$id];
        }

        
ksort($parent);
        
reset($parent);

        
return $parent;
    } 
// end func
   
    
/**
     * Short description.
     *
     * Detail description
     * @param      none
     * @global     none
     * @since      1.0
     * @access     private
     * @return     void
     * @update     date time
    
*/
    
function getChild ($id)
    {
        
return $this->child[$id];
    } 
// end func

   
    
/**
     * Short description.
     *
     * Detail description
     * @param      none
     * @global     none
     * @since      1.0
     * @access     private
     * @return     void
     * @update     date time
    
*/
    
function getChilds ($id = 0)
    {
        
$child = array($id);
        
$this->getList($child, $id);

        
return $child;
    } 
// end func
// end class

?>
使用方法:

使用方法

PHP代码:--------------------------------------------------------------------------------
//new Tree(根目录的名字);
//根目录的ID自动分配为0
$Tree = new Tree('根目录');

//setNode(目录ID,上级ID,目录名字);
$Tree->setNode(1, 0, '目录1');
$Tree->setNode(2, 0, '目录2');
$Tree->setNode(3, 0, '目录3');
$Tree->setNode(4, 3, '目录3.1');
$Tree->setNode(5, 3, '目录3.2');
$Tree->setNode(6, 3, '目录3.3');
$Tree->setNode(7, 2, '目录2.1');
$Tree->setNode(8, 2, '目录2.2');
$Tree->setNode(9, 2, '目录2.3');
$Tree->setNode(10, 6, '目录3.3.1');
$Tree->setNode(11, 6, '目录3.3.2');
$Tree->setNode(12, 6, '目录3.3.3');

//getChilds(指定目录ID);
//取得指定目录下级目录.如果没有指定目录就由根目录开始
$category = $Tree->getChilds();

//遍历输出
foreach ($category as $key=>$id)
{
    echo $Tree->getLayer($id, '|-').$Tree->getValue($id)."<br />\n";
}

--------------------------------------------------------------------------------

输出的结果

PHP代码:--------------------------------------------------------------------------------
根目录
|-目录1
|-目录2
|-|-目录2.1
|-|-目录2.2
|-|-目录2.3
|-目录3
|-|-目录3.1
|-|-目录3.2
|-|-目录3.3
|-|-|-目录3.3.1
|-|-|-目录3.3.2
|-|-|-目录3.3.3