php从数据库查询结果生成树形列表的方法

本文实例讲述了php从数据库查询结果生成树形列表的方法。分享给大家供大家参考。具体分析如下:

本代码可以从数据库读取数据生成一个类似于windows的资源管理器的树形列表

  <?php  /* Here are the database definitions (for Solid) that i use in this code.   * It should not be hard to adapt it to another database.   */  /*  CREATE TABLE dirent_types (   id INTEGER NOT NULL,   icon VARCHAR(50),   name VARCHAR(50),   PRIMARY KEY(id)  );  INSERT INTO dirent_types VALUES(1, 'folderclosed', 'Directory');  INSERT INTO dirent_types VALUES(2, 'document', 'File');  CREATE TABLE directory (   id INTEGER NOT NULL,   parent INTEGER REFERENCES directory(id),   name VARCHAR(200),   icon VARCHAR(50),   type INTEGER REFERENCES dirent_types(id),   url VARCHAR(200),   PRIMARY KEY(id)  );  DROP INDEX directory_idx;  CREATE UNIQUE INDEX directory_idx ON directory(parent, name);  CREATE SEQUENCE dirent_id;  "CREATE PROCEDURE insert_dir_entry   (name VARCHAR, parent INTEGER, type INTEGER)   RETURNS(id INTEGER)  BEGIN   EXEC SQL WHENEVER SQLERROR ABORT;   EXEC SEQUENCE dirent_id.NEXT INTO id;   EXEC SQL PREPARE c_insert   INSERT INTO directory   (id, parent, type, name)   VALUES(?, ?, ?, ?);   EXEC SQL EXECUTE c_insert USING (id, parent, type, name);   EXEC SQL DROP c_insert;  END";  CALL insert_dir_entry('My Computer', NULL, 1);  CALL insert_dir_entry('Network Neighbourhood', NULL, 1);  CALL insert_dir_entry('lucifer.guardian.no', 2, 1);  CALL insert_dir_entry('rafael.guardian.no', 2, 1);  CALL insert_dir_entry('uriel.guardian.no', 2, 1);  CALL insert_dir_entry('Control Panel', NULL, 1);  CALL insert_dir_entry('Services', 6, 1);  CALL insert_dir_entry('Apache', 7, 2);  CALL insert_dir_entry('Solid Server 2.2', 7, 2);  */  function icon($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%s border=0 align=top src="/pics/menu/%s.gif" '.   'width="%d" height="%d">', $name ? " name="$name"" : '',   $icon, $width, $height);  }  function display_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( '<div id="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]) {   // has children, i.e. it is a folder   $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( "<a href="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( '?<font size="%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( "</divn>");  }  function setup_directory($parent, $maxdepth)  {   global $dirent_icons, $child_nodes, $node_data, $last_child;   $dirent_icons = sql_assoc('SELECT id,icon FROM dirent_types');   $query = 'SELECT id,parent,type,icon,name '.   'FROM directory '.   'ORDER BY parent,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程序设计有所帮助。

php从数据库查询结果生成树形列表的方法

郑重声明:本网站发布的内容(图片、视频和文字)以及用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服