本文实例讲述了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( \"</div\\n>\"); } 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程序设计有所帮助。
本文地址:https://www.stayed.cn/item/26130
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我