这篇文章主要介绍了php从数据库查询结果生成树形列表的方法,涉及php操作html元素生成树形列表的技巧,非常具有实用价值,需要的朋友可以参考下
本文实例讲述了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程序设计有所帮助。
新闻热点
疑难解答