源代码<?
if(!defined("CLASS_GggCatagory"))
{
define("CLASS_GggCatagory","1");class GggCatagory
{
    var $mParentArray= array();            //根据 key 得到  parent
    var $mValueArray= array();            //根据 key 得到  Value
    var $mKeyArray= array();            //根据 序号 得到  key
    var $mChildrenArray= array();        //根据 parent 来得到 key,这时对应的key有可能会是多条,用二维数组来保存(相当于得到下一级的功能)//该二维数组保存 最后生成的树 按从树根到枝叶排序
    var $mTreeArray=array();            // $mTreeArray['key'][0] ,$mTreeArray['value'][0] ...//调用时传替过来的数组下标
    var $mKey;
    var $mValue;
    var $mParent;    var $mparentKey=0;                    //根节点的值 默认 parent 为0表示该节点为根节点
    var $indent=' - ';                        //缩进 的符号    function GggCatagory($tmpData,$tmpKey="key",$tmpValue="value",$tmpParent="parent")
    {
        foreach($tmpData  as $key => $value)
        {
            $this->mKeyArray[$key]=$value[$tmpKey];
            $this->mParentArray[$value[$tmpKey]]=$value[$tmpParent];    //得到上一级id
            $this->mValueArray[$value[$tmpKey]]=$value[$tmpValue];
            $this->mChildrenArray[$value[$tmpParent]][]=$key;            //根据 pid 来得到 key 相当于得到下一级的功能
            //print($value[$tmpParent]);    
            //print("?");    
        }
        $this->mKey=$tmpKey;
        $this->mValue=$tmpValue;
        $this->mParent=$tmpParent;
    }//END GggCatagory
//************************* 设置根节点的值 默认 parent 为0表示该节点为根节点 *************************    function SetParentKey($keyId)
    {
        $this->mparentKey=$keyId;
    }//END Set_ParentKey
//************************* 当前节点下面是否还有子节点 *************************
    function HasChildren($keyId)
    {
        return  count($this->mChildrenArray[$keyId])<1?false:true;
    }//END HasChildren
//************************* 查看当前节点是不是根节点 *************************
    function isRootParent($keyId)
    {
        return  $this->mParentArray[$keyId]==$this->mparentKey;
    }//END isRootParent    function GetNode($keyId)
    {
        if(!in_array($keyId,$this->mKeyArray))    //如果当前节点不存在直接返回
            return;
        unset($tmpTreeArray);
        $tmpTreeArray[$this->mKey][]=$keyId;
        $tmpTreeArray[$this->mValue][]=$this->mValueArray[$keyId];
        $tmpTreeArray[$this->mParent][]=$this->mParentArray[$keyId];
        return $tmpTreeArray;
    }//END GetNode    function GetParent($keyId)
    {
        if($this->isRootParent($keyId))        //本身是根类了
            return;
        return $this->GetNode($this->mParentArray[$keyId]);
    }//END GetParent    function GetChildren($keyId)
    {
        if(!$this->HasChildren($keyId))
            return;
        $currKey=$keyId;
        $tmpTreeArray=array();
        $keyIdArray=$this->mChildrenArray[$currKey];        //得到当前类下的子类
        if(is_array($keyIdArray))                            //表示类下有子类
        {
            foreach($keyIdArray  as $key => $value)
            {
                $currKey=$this->mKeyArray[$value];
                $tmpTreeArray[$this->mKey][]=$currKey;
                $tmpTreeArray[$this->mValue][]=$this->mValueArray[$currKey];
                $tmpTreeArray[$this->mParent][]=$this->mParentArray[$currKey];
            }
        }
        //print($tmpTreeArray[0][$this->mKey]);
        return $tmpTreeArray;
    }//END GetChildren
    function getCategoryChildrens($parent_key, $indent='', &$category_array)
    {
        $tmpData=$this->GetChildren($parent_key);
        $len_i=count($tmpData[$this->mKey]);
        for($tmp_i=0;$tmp_i<$len_i;$tmp_i++)
        {
            $category_array[$tmpData[$this->mKey][$tmp_i]] = $indent.$tmpData[$this->mValue][$tmp_i];
            $this->getCategoryChildrens($tmpData[$this->mKey][$tmp_i],$indent.' - ',$category_array);
        }
    } //end getCategoryChildrens    
}//END class GggCatagory
}
//*********************  类测试 
//*********************  类测试 
//*********************  类测试 
/*$tmpArray = array(array('id'=>1, 'name'=>'aaa', 'pid'=>0),
              array('id'=>2, 'name'=>'aaa1', 'pid'=>1),
              array('id'=>3, 'name'=>'bbb', 'pid'=>0),
              array('id'=>4, 'name'=>'bbb1', 'pid'=>3),
              array('id'=>5, 'name'=>'aaa1_1_1', 'pid'=>6),
              array('id'=>6, 'name'=>'aaa1_1', 'pid'=>2),
              array('id'=>7, 'name'=>'aaa1_1_2', 'pid'=>6),
              array('id'=>8, 'name'=>'bbb2', 'pid'=>3),
              array('id'=>9, 'name'=>'aaa1_1_3', 'pid'=>6),
              array('id'=>10, 'name'=>'ccc', 'pid'=>0),
              array('id'=>11, 'name'=>'ccc1', 'pid'=>10),
              array('id'=>12, 'name'=>'ccc2', 'pid'=>10),
              array('id'=>13, 'name'=>'ccc3', 'pid'=>10),
              array('id'=>14, 'name'=>'ccc2_1', 'pid'=>12),
              array('id'=>15, 'name'=>'ccc2_2', 'pid'=>12),
            );// 也可以直接从数据库里导入数据
// $Query_Show  = "SELECT id,  name, pid FROM  Categories  ";
// $result=$DB_site->query($Query_Show);
// while($record=$DB_site->fetch_array($result)) 
// {
//     $tmpArray[]=$record;    //所有的数据存在了tmpArray
// }$keyId=0;
$categoryClass = new GggCatagory($tmpArray,"id","name","pid");
$categoryClass->SetParentKey(0);            //设置代表根类的key$category_array = array();
//$categoryClass->getCategoryChildrens(0,' - ',$category_array);
$categoryClass->getCategoryChildrens($keyId,' - ',$category_array);foreach ($category_array as $key => $value) 
{
    print($key.":");
    print($value);
    print("<br>");
}    
//!!!!!!!!!!!!!!!!!!!!!  类测试 
//!!!!!!!!!!!!!!!!!!!!!  类测试 
//!!!!!!!!!!!!!!!!!!!!!  类测试 ?>

解决方案 »

  1.   

    从数据库读出数结构例子.
        $Query_Show  = "SELECT CategoryKey,  Name, ParentKey FROM  interact_QTCategories  ";
        $result=$DB_site->query($Query_Show);
        while($record=$DB_site->fetch_array($result)) 
        {
            $tmpArray[]=$record;
        }
        $DB_site->free_result($result);    $categoryClass = new GggCatagory($tmpArray,"CategoryKey","Name","ParentKey");
        $categoryClass->getCategoryChildrens(47,' - ',$category_array);
        foreach ($category_array as $key => $value) 
        {
            print($key.":");
            print($value);
            print("<br>");
        }