本文实例讲述了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
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我