微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

rush:PHP;"> 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),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,name); EXEC sql DROP c_insert; END"; CALL insert_dir_entry('My Computer',NULL,1); CALL insert_dir_entry('Network Neighbourhood',1); CALL insert_dir_entry('lucifer.guardian.no',2,1); CALL insert_dir_entry('rafael.guardian.no',1); CALL insert_dir_entry('uriel.guardian.no',1); CALL insert_dir_entry('Control Panel',1); CALL insert_dir_entry('Services',6,1); CALL insert_dir_entry('Apache',7,2); CALL insert_dir_entry('Solid Server 2.2',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( '%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( '
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( ""); } $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( '?%s',-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( ""); } function setup_directory($parent,$maxdepth) { global $dirent_icons,$child_nodes,$last_child; $dirent_icons = sql_assoc('SELECT id,icon FROM dirent_types'); $query = 'SELECT id,icon,name '. 'FROM directory '. 'ORDER BY parent,name'; $child_nodes = array(); $node_data = array(); $res = sql($query); while (list($id,$type,$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程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐