源代码<?
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>");
}
//!!!!!!!!!!!!!!!!!!!!! 类测试
//!!!!!!!!!!!!!!!!!!!!! 类测试
//!!!!!!!!!!!!!!!!!!!!! 类测试 ?>
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>");
}
//!!!!!!!!!!!!!!!!!!!!! 类测试
//!!!!!!!!!!!!!!!!!!!!! 类测试
//!!!!!!!!!!!!!!!!!!!!! 类测试 ?>
$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>");
}