这几天写的php树类.

klggg 2004-09-16 07:42:02
感谢这扁文章给我的启发
http://community.csdn.net/Expert/topic/2980/2980875.xml?temp=.6911585

原帖请见:
http://202.101.43.198/ggg/wcg/showthread.php?s=8c4a7c887927aed66cb3fc55c6cfbc2b&postid=129#post129

下载该类源代码:
http://202.101.43.198/ggg/wcg/attachment.php?s=8c4a7c887927aed66cb3fc55c6cfbc2b&postid=128



调用代码:
$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),
);
$keyId=0;
$categoryClass = new GggCatagory($tmpArray,"id","name","pid");
$categoryClass->SetParentKey(0); //设置代表根类的key
$categoryClass->getCategoryChildrens($keyId,' - ',$category_array);
foreach ($category_array as $key => $value)
{
print($key.":");
print($value);
print("<br>");
}

结果
1: - aaa
2: - - aaa1
6: - - - aaa1_1
5: - - - - aaa1_1_1
7: - - - - aaa1_1_2
9: - - - - aaa1_1_3
3: - bbb
4: - - bbb1
8: - - bbb2
10: - ccc
11: - - ccc1
12: - - ccc2
14: - - - ccc2_1
15: - - - ccc2_2
13: - - ccc3

...全文
187 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuguanglou 2004-09-16
  • 打赏
  • 举报
回复
嵌入表格可能作用大点
klggg 2004-09-16
  • 打赏
  • 举报
回复
从数据库读出数结构例子.
$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>");
}
klggg 2004-09-16
  • 打赏
  • 举报
回复
抛砖引玉,大家一起来完善 :)
klggg 2004-09-16
  • 打赏
  • 举报
回复
源代码

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

?>

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧