php从数据库查询结果生成树形列表的方法
本文实例讲述了php从数据库查询结果生成树形列表的方法。分享给大家供大家参考。具体分析如下:
本代码可以从数据库读取数据生成一个类似于windows的资源管理器的树形列表
<?php
/*Herearethedatabasedefinitions(forSolid)thatiuseinthiscode.
*Itshouldnotbehardtoadaptittoanotherdatabase.
*/
/*
CREATETABLEdirent_types(
idINTEGERNOTNULL,
iconVARCHAR(50),
nameVARCHAR(50),
PRIMARYKEY(id)
);
INSERTINTOdirent_typesVALUES(1,'folderclosed','Directory');
INSERTINTOdirent_typesVALUES(2,'document','File');
CREATETABLEdirectory(
idINTEGERNOTNULL,
parentINTEGERREFERENCESdirectory(id),
nameVARCHAR(200),
iconVARCHAR(50),
typeINTEGERREFERENCESdirent_types(id),
urlVARCHAR(200),
PRIMARYKEY(id)
);
DROPINDEXdirectory_idx;
CREATEUNIQUEINDEXdirectory_idxONdirectory(parent,name);
CREATESEQUENCEdirent_id;
"CREATEPROCEDUREinsert_dir_entry
(nameVARCHAR,parentINTEGER,typeINTEGER)
RETURNS(idINTEGER)
BEGIN
EXECSQLWHENEVERSQLERRORABORT;
EXECSEQUENCEdirent_id.NEXTINTOid;
EXECSQLPREPAREc_insert
INSERTINTOdirectory
(id,parent,type,name)
VALUES(?,?,?,?);
EXECSQLEXECUTEc_insertUSING(id,parent,type,name);
EXECSQLDROPc_insert;
END";
CALLinsert_dir_entry('MyComputer',NULL,1);
CALLinsert_dir_entry('NetworkNeighbourhood',NULL,1);
CALLinsert_dir_entry('lucifer.guardian.no',2,1);
CALLinsert_dir_entry('rafael.guardian.no',2,1);
CALLinsert_dir_entry('uriel.guardian.no',2,1);
CALLinsert_dir_entry('ControlPanel',NULL,1);
CALLinsert_dir_entry('Services',6,1);
CALLinsert_dir_entry('Apache',7,2);
CALLinsert_dir_entry('SolidServer2.2',7,2);
*/
functionicon($icon,$name='',$width=0,$height=0){
global$DOCUMENT_ROOT;
$icon_loc='/pics/menu';
$file="$DOCUMENT_ROOT$icon_loc/$icon.gif";
if(!$width||!$height){
$iconinfo=getimagesize($file);
if(!$width){
$width=$iconinfo[0];
}
if(!$height){
$height=$iconinfo[1];
}
}
printf('<img%sborder=0align=topsrc="/pics/menu/%s.gif"'.
'width="%d"height="%d">',$name?"name=\"$name\"":'',
$icon,$width,$height);
}
functiondisplay_directory($parent,$showdepth=0,$ancestors=false){
global$child_nodes,$node_data,$last_child;
reset($child_nodes[$parent]);
$size=sizeof($child_nodes[$parent]);
$lastindex=$size-1;
if(!$ancestors){
$ancestors=array();
}
$depth=sizeof($ancestors);
printf('<divid="node_%d"class="dirEntry"visibility="%s">',
$parent,$showdepth>0?'show':'hide');
while(list($index,$node)=each($child_nodes[$parent])){
for($i=0;$i<$depth;$i++){
$up_parent=(int)$node_data[$ancestors[$i]]['parent'];
$last_node_on_generation=$last_child[$up_parent];
$uptree_node_on_generation=$ancestors[$i];
if($last_node_on_generation==$uptree_node_on_generation){
icon("blank");
}else{
icon("line");
}
}
if($child_nodes[$node]){
//haschildren,i.e.itisafolder
$conn_icon="plus";
$expand=true;
}else{
$conn_icon="join";
$expand=false;
}
if($index==$lastindex){
$conn_icon.="bottom";
}elseif($depth==0&&$index==0){
$conn_icon.="top";
}
if($expand){
printf("<ahref=\"javascript:document.layers['node_%d'].visibility='show'\">",$node);
}
icon($conn_icon,"connImg_$node");
if($expand){
print("</a>");
}
$icon=$node_data[$node]['icon'];
if(!$icon){
$type=$node_data[$node]['type'];
$icon=$GLOBALS['dirent_icons'][$type];
}
icon($icon,"nodeImg_$node");
$name=$node_data[$node]['name'];
printf('?<fontsize="%d">%s</font><br%c>',-1,$name,10);
if($child_nodes[$node]){
$newdepth=$showdepth;
if($newdepth>0){
$newdepth--;
}
$new_ancestors=$ancestors;
$new_ancestors[]=$node;
display_directory($node,$newdepth,$new_ancestors);
}
}
print("</div\n>");
}
functionsetup_directory($parent,$maxdepth)
{
global$dirent_icons,$child_nodes,$node_data,$last_child;
$dirent_icons=sql_assoc('SELECTid,iconFROMdirent_types');
$query='SELECTid,parent,type,icon,name'.
'FROMdirectory'.
'ORDERBYparent,name';
$child_nodes=array();
$node_data=array();
$res=sql($query);
while(list($id,$parent,$type,$icon,$name)=db_fetch_row($res)){
$child_nodes[(int)$parent][]=$id;
$node_data[$id]=array('id'=>$id,
'parent'=>$parent,
'type'=>$type,
'icon'=>$icon,
'name'=>$name);
$last_child[(int)$parent]=$id;
}
}
?>
希望本文所述对大家的php程序设计有所帮助。