PhP树型产品查询,php 从数据库查询结果生成树形列表的简单示例

这篇文章主要为大家详细介绍了php 从数据库查询结果生成树形列表的简单示例,具有一定的参考价值,可以用来参考一下。

本代码可以从数据库读取数据生成一个类似于windows的资源管理器的树形列表,感兴趣的小伙伴,下面一起跟随512笔记的小编罗X来看看吧。

经测试代码如下:

/**

* 数据库查询结果生成树形列表

*

* @param

* @arrange (512.笔记) www.512pic.com

* 以下是我在此代码中使用的数据库定义(对于Solid)。

* 将其改编为另一个数据库应该不难。

**/

/*

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( '%s.gif

'width="%d" height="%d">', $name ? " name=\"$name\"" : '',

$icon, $width, $height);

}

/*

*以递归方式显示给定起始的树的内容

*点。

*

*参数:

* $ parent - 父节点(未在目录中列出)。 节点

* 0是根节点。

*

* $ maxdepth(可选) - 最大递归级别数。-1

*(默认值)表示没有限制。

*

* $ ancestors(可选) - 一个祖先节点的数组

*树的当前分支,节点最接近

*指数0的顶部。

*

*使用的全局变量:

* $ child_nodes

* $ node_data

* $ last_child

*

*全局变量修改:

*将修改$ child_nodes中的数组指针。

*/

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( '

',

$parent, $showdepth > 0 ? 'show' : 'hide');

while (list($index, $node) = each($child_nodes[$parent])) {

/*

For each of the uptree nodes:

If an uptree node is not the last one on its depth

of the branch, there should be a line instead of a blank

before this node's icon.

*/

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( "", $node);

}

icon($conn_icon, "connImg_$node");

if ($expand) {

print( "");

}

$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, $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;

}

}

/*** 代码来自512笔记(www.512pic.com) ***/

注:关于php 从数据库查询结果生成树形列表的简单示例的内容就先介绍到这里,更多相关文章的可以留意512笔记的其他信息。

关键词:数据库查询,树形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值