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程序设计有所帮助。