php從數(shù)據(jù)庫查詢結(jié)果生成樹形列表的方法
更新時間:2015年04月17日 11:40:17 作者:皮蛋
這篇文章主要介紹了php從數(shù)據(jù)庫查詢結(jié)果生成樹形列表的方法,涉及php操作html元素生成樹形列表的技巧,非常具有實用價值,需要的朋友可以參考下
本文實例講述了php從數(shù)據(jù)庫查詢結(jié)果生成樹形列表的方法。分享給大家供大家參考。具體分析如下:
本代碼可以從數(shù)據(jù)庫讀取數(shù)據(jù)生成一個類似于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程序設(shè)計有所幫助。
相關(guān)文章
win2003服務(wù)器使用WPS的COM組件的一些問題解決方法
項目中使用了新功能,gump同學(xué)研究出來的使用WPS的COM組件用PHP實現(xiàn)將doc等office格式轉(zhuǎn)換成pdf2012-01-01
php上的memcache和memcached兩個pecl庫
一開始就在疑惑為什么會有兩個庫,且在php.net官方都有文檔支持。2010-03-03
PHP substr 截取字符串出現(xiàn)亂碼問題解決方法[utf8與gb2312]
在PHP中,使substr函數(shù)截取字符串末位會出現(xiàn)亂碼,因為中文UTF-8編碼,每個漢字占3字節(jié),而GB2312占2字節(jié),英文占1字節(jié),截取位不準(zhǔn)確,造成斷開的字符會把其后的..拉過來一起做一個字,所以出現(xiàn)了亂碼。2011-12-12
php異步:在php中使用fsockopen curl實現(xiàn)類似異步處理的功能方法
下面小編就為大家?guī)硪黄猵hp異步:在php中使用fsockopen curl實現(xiàn)類似異步處理的功能方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12

