使用php阶梯式输出无限分级所有栏目

使用php阶梯式输出无限分级所有栏目

思路:
       先查找所有的顶级栏目,在每一个顶级栏目查找后,马上查找它的子栏目,如果有就将其与主栏目连起来,并继续查找下一级子栏目。如果没有子栏目,继续找下一个主栏目。里面的数据库,自己加了一个层loop字段,以前没加这个字段,为了阶梯式显示很不好做。

下面代码经测试,能正确运行。

[复制到剪切板]
CODE:
<?php
/***
* function:阶地式调用无限分级列表
* author:manx00
* time:2009-9-11
**/
mysql_connect("hostnam","user","passwd");
mysql_select_db("database");
/***********************************
mysql数据库
--------------------
CREATE TABLE `ta` (
`id` int(11) NOT NULL DEFAULT '0',
`pid` int(11) DEFAULT NULL,
`loop` int(11) DEFAULT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `ta` VALUES (1, 0, 1, 'a');
INSERT INTO `ta` VALUES (2, 0, 1, 'b');
INSERT INTO `ta` VALUES (3, 0, 1, 'c');
INSERT INTO `ta` VALUES (4, 1, 2, 'aa');
INSERT INTO `ta` VALUES (5, 2, 2, 'bb');
INSERT INTO `ta` VALUES (6, 3, 2, 'cc');
INSERT INTO `ta` VALUES (7, 4, 3, 'aaa');
INSERT INTO `ta` VALUES (8, 4, 3, 'aaa1');
INSERT INTO `ta` VALUES (9, 7, 4, 'aaaa');
************************************/

/***
* 查找主栏目
* $str 为全局变量,这样可以使主栏目与子栏目相关联
*/
function ArrayOne(){
global 
$str//最后返回的栏目字符串
$sql "select * from ta where pid=0;"//查找主栏目
$result mysql_query($sql);
if(!
$result){ 
echo 
"你的sql语句不正确!";
}
if(
mysql_num_rows($result) == 0){
//$str = "没有数据!";
return false//如果没有下级栏目,结束本函数
}
while(
$row mysql_fetch_array($result)){
$str .= str_repeat(">",$row['loop']).$row['name']."<br />"
//$str .= str_repeat(">",$row['loop'])."pid:[".$row['pid']."]#id:[".$row['id']."]#name[".$row['name']."]<br />"; //阶梯式输出该主栏目
ArrayChild($row['id']);
}
return 
$str;
}
/***
* 查找子栏目
* $str与ArrayOne一致
* $pid 为 上级栏目的id
*/
function ArrayChild($pid){
global 
$str;
$sql "select * from ta where pid='".$pid."';"//查找子栏目
$result mysql_query($sql);
if(!
$result){
echo 
"你的sql语句不正确!";
}
if(
mysql_num_rows($result) == 0){
//$str = "没有数据!";
return false;
}
while(
$row mysql_fetch_array($result)){
$str .= str_repeat(">",$row['loop']).$row['name']."<br />"//阶梯式输出该主栏目
ArrayChild($row['id']); //循环调用查找子栏目函数
}
}
echo 
ArrayOne(); //阶梯式输出全部栏目
?> ;

[ 本帖最后由 manx00 于 2009-9-24 08:43 编辑 ]

附件

65_48_5ec41fc47c277d7.jpg (5.48 KB)

2009-9-24 08:43

65_48_5ec41fc47c277d7.jpg

嗯。这个思路实现无限分级就比较方便了。最好返回一个数组,可以在多个地方调用。
也可以一次从数据表把所有数据拿出,然后再排序。这样可以避免多次查询数据库。呵呵,之前也研究了一下
http://www.phpfans.net/blog/2/article/6.html
如履薄冰

回复 2# 我不是鱼 的帖子

有道理,这种方法就是出现很多分级时很慢,要改进下

学习到了·····不错···

恩 好东西 学习啦!