本文实例讲述了PHP从数据库查询结果生成树形列表的方法。分享给大家供大家参考。具体分析如下:
本代码可以从数据库读取数据生成一个类似于windows的资源管理器的树形列表
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( ' 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( '?
',-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;
}
}
?>
',-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( "