论坛: 编程破解 标题: 冬瓜、溶、夕阳、和尚,估计这个问题会杀死大家很多脑细胞 复制本贴地址    
作者: group [group]    论坛用户   登录
用户:19800128(当尘埃落定时)

==================================================
消息组:我的好友
==================================================
消息类型:聊天记录
==================================================

--------------------------------------------------
消息对象:93353( 可爱的小狐)
--------------------------------------------------
2003-04-27 00:55:31 当尘埃落定时
我要找美工,有没有朋友推荐?
(通过服务器中转)

2003-04-27 00:52:04  可爱的小狐
没有哦,你问rd


2003-04-27 00:56:01 当尘埃落定时
rd不在线

2003-04-27 00:52:35  可爱的小狐
明天吧

2003-04-27 00:56:31 当尘埃落定时
有没有支持无限目录树的程序代码和数据库结构?

2003-04-27 00:54:19  可爱的小狐
什么用的?举个例子说说

2003-04-27 00:58:56 当尘埃落定时
像易趣的产品分类一样的,要支持无限分类

2003-04-27 00:56:07  可爱的小狐
那你自己写就可以哦,其实很简单的,主要是数据库的思路好就可以,问小淘吧

2003-04-27 01:00:38 当尘埃落定时
我知道很简单,但是想了两天了

2003-04-27 00:57:29  可爱的小狐
其实数据库部分问小淘可以的,程序应该不难

2003-04-27 01:01:24 当尘埃落定时
我的数据库结构也简单
class_id  parent_class_id  class_name class_level  

2003-04-27 01:01:40 当尘埃落定时
现在我这个数据库,就是程序难

2003-04-27 00:58:48  可爱的小狐
但你要考虑好分类的再分类,因为你需要无限分类的话那也要支持无限的下层分类哦

2003-04-27 00:59:11  可爱的小狐
不是吧,居然把你难到了?晕

2003-04-27 01:04:17 当尘埃落定时
无限分类就要根据parent_class_id来判断,任何一个class_id都可以成为其他class_id的parent_class_id

2003-04-27 01:04:37 当尘埃落定时
这个思路就可以解决无限分类的问题,我现在就是显示的时候有麻烦

2003-04-27 01:00:58  可爱的小狐
对哦,那程序有什么难的?

2003-04-27 01:01:21  可爱的小狐
不会把,难在那?

2003-04-27 01:07:23 当尘埃落定时
while($class_id)
{
  while(child_class_id())
  {
    while(child_class_id())
     ……就这样无限循环下去
  }
}

2003-04-27 01:04:12  可爱的小狐
晕,这样你要写多少?不需要的

2003-04-27 01:08:09 当尘埃落定时
怎么做

2003-04-27 01:06:32  可爱的小狐
我不知道能不能找到,以前我写过类似的,但已经是半年前的东西,不知道在哪,我要找找

2003-04-27 01:10:39 当尘埃落定时
我写了一个函数,给你看看

2003-04-27 01:07:15  可爱的小狐
好的

2003-04-27 01:11:56 当尘埃落定时
不过没有写完,思路堵住了

2003-04-27 01:12:01 当尘埃落定时
function GetChild($class_id){
global $g_cDBBGS;
$sql = "select class_id,class_name from class where parent_class_id = $class_id";
$g_cDBBGS->query($sql);
while($g_cDBBGS->next_record())
{
$class_id = $g_cDBBGS->f(class_id);
$class_name = $g_cDBBGS->f(class_name);
GetChild($class_id);
}
}

2003-04-27 01:08:23  可爱的小狐
给我看看嘛

2003-04-27 01:10:05  可爱的小狐
你的函数想表达什么?

2003-04-27 01:14:26 当尘埃落定时
自己调用自己造成一个循环

2003-04-27 01:20:14  可爱的小狐
好,我终于忙完了,呵呵,你的程序想做什么,给点思路我哦

2003-04-27 01:24:57 当尘埃落定时
就是要显示一个目录树

2003-04-27 01:25:12 当尘埃落定时
function GetChild($class_id){
global $g_cDBBGS;
$sql = "select class_id,class_name,class_level from class where parent_class_id = $class_id and class_id <> 1";
echo $sql."\n";
$g_cDBBGS->query($sql);
while($g_cDBBGS->next_record())
{
$class_id = $g_cDBBGS->f(class_id);
$class_name = $g_cDBBGS->f(class_name);
$class_level = $g_cDBBGS->f(class_level);
echo "<option value=$class_id>".addSpace($class_level)."$class_name</option>\n";
//$result = $result.addSpace($class_level).$class_id.$class_name."<BR>\n";
GetChild($class_id);
//select class_id,class_name,class_level from class where parent_class_id = 1 and class_id <> 1
//select class_id,class_name,class_level from class where parent_class_id = 2 and class_id <> 1
//select class_id,class_name,class_level from class where parent_class_id = 3 and class_id <> 1
//select class_id,class_name,class_level from class where parent_class_id = 7 and class_id <> 1
//当做完parent_class_id = 7时,结果集$g_cDBBGS应该读取next_record(),再次循环,但是这个程序没有再次循环
//怀疑是结果集被重写了,因此需要有一个自动建立数据库对象的思路,现在还没有想到
}
}

2003-04-27 01:25:24 当尘埃落定时
这段代码可以实现一部分功能

2003-04-27 01:22:50  可爱的小狐
就是程序吧目录树显示出来对吧,判别该分类有没有下分类,有就显示该分类的小分类....一直下去?

2003-04-27 01:26:47 当尘埃落定时
比如我期望的目录树是
1
|-2
| |-3
|-4
  |-5

  

2003-04-27 01:27:09 当尘埃落定时
这段代码只能显示出
1
|-2
| |-3


2003-04-27 01:27:23 当尘埃落定时


2003-04-27 01:27:40 当尘埃落定时
看看哪里需要改动?

2003-04-27 01:25:16  可爱的小狐
等等,我在想,我觉得用两个表会好很多,一个做为根,另外一个做分支,这样就不会乱了,否则判断就好象很乱

2003-04-27 01:29:27 当尘埃落定时
如果我有多层分支的话那不是要一大堆表?

2003-04-27 01:30:45 当尘埃落定时
我有一个根数据叫做“所有类别”

2003-04-27 01:31:02 当尘埃落定时
是不显示的,所有的类都是它的子类

2003-04-27 01:27:55  可爱的小狐
不需要,只要两个而已,一个是根表放1,6 另外的放分支表

1
|-2
| |-3
|-4
| |-5
| |-7
|
6-8
| |-9
  

2003-04-27 01:32:14 当尘埃落定时
有区别吗?

2003-04-27 01:28:33  可爱的小狐
可以哦,因为你的分支是无穷的哦,对用户来说是透明的

2003-04-27 01:32:54 当尘埃落定时
具体说说思路

2003-04-27 01:29:15  可爱的小狐
意思是你只有一个根1吗?不会出6这个东西?

2003-04-27 01:33:54 当尘埃落定时
对,这个根已经被隐含了

2003-04-27 01:30:19  可爱的小狐
哪你的大分类就相当于根,简单点说电子产品就是的根,根下面有电脑,家电,通讯,再下面又分....

2003-04-27 01:34:44 当尘埃落定时
那和我现在这样分没有区别啊

2003-04-27 01:31:20  可爱的小狐
对哦,你还没考虑多个大目录的问题哦,你看意趣的大目录就几个,其实你需要的就是他哪套思路而已

2003-04-27 01:35:53 当尘埃落定时
我只有一个大目录,就是叫做所有类别的,其他的其实全是它的子目录

2003-04-27 01:36:13 当尘埃落定时
不能接收么?

2003-04-27 01:32:28  可爱的小狐
有是有一点的,我再想想...东西好想传不过来

2003-04-27 01:32:59  可爱的小狐
没反应.....

2003-04-27 01:37:54 当尘埃落定时
  http://www.netyd.com/untitled1.gif  
  http://www.netyd.com/untitled2.gif  


2003-04-27 01:40:36 当尘埃落定时
理论上来说,我那个函数在列举完了第一个子分类后就会去列举第二个

2003-04-27 01:37:25  可爱的小狐
在想...

2003-04-27 01:41:28 当尘埃落定时


2003-04-27 01:44:45 当尘埃落定时
始终只能显示单路

2003-04-27 01:41:02  可爱的小狐
class_level是代表他是第几层的吧

2003-04-27 01:45:50 当尘埃落定时


2003-04-27 01:42:17  可爱的小狐
哦,在想....

2003-04-27 01:48:36  可爱的小狐
哦,用一个表是可以的,我还在想...

2003-04-27 01:52:58 当尘埃落定时
对,很难的

2003-04-27 01:53:42 当尘埃落定时
select class_id,class_name,class_level from class where parent_class_id = 1 and class_id <> 1
<option value=2>花天酒地</option>
select class_id,class_name,class_level from class where parent_class_id = 2 and class_id <> 1
<option value=3> 无赖地痞</option>
select class_id,class_name,class_level from class where parent_class_id = 3 and class_id <> 1
<option value=7>  再次无聊</option>
select class_id,class_name,class_level from class where parent_class_id = 7 and class_id <> 1

2003-04-27 01:50:01  可爱的小狐
不会的,可以想的,我原来写的程序没了,数据库还在....晕,但能想出来

2003-04-27 01:54:00  可爱的小狐
可以的,不会很难,在想....

2003-04-27 01:58:02 当尘埃落定时
我也在做

2003-04-27 01:55:57  可爱的小狐
你去http://www.myrain.org/downloads.php?sort=1

2003-04-27 01:56:30  可爱的小狐
音频工具哪你就看到了

2003-04-27 02:00:53 当尘埃落定时
还是单线的吧

2003-04-27 01:57:35  可爱的小狐
谁说的,你现在在去看,我在增加

2003-04-27 02:02:10 当尘埃落定时
这种显示我能做到

2003-04-27 02:02:35 当尘埃落定时
我要看一个在同一页面完全打开的目录树~

2003-04-27 01:58:57  可爱的小狐
哪就可以哦,哪就说明思路对了,往下显示有什么不可以,晕

2003-04-27 01:59:24  可爱的小狐
其实能做这个就能做树显示了,我倒


2003-04-27 02:03:41 当尘埃落定时
这种显示只不过是调用了一次
select class_name from class where parent_class_id = $class_id
而已,然后就是单纯的显示数据

2003-04-27 02:00:19  可爱的小狐
你等一下,我大概的写一下

2003-04-27 02:04:55 当尘埃落定时
不能的,比如我在安装制作里面,往上回溯父类是很简单的,因为只有一条线,没有分支,而找出安装制作下面一层的也很容易,问题就在于我要显示子类的子类

2003-04-27 02:01:56  可爱的小狐
哦,我明白了,你要问什么了,你等一下...我再想想

2003-04-27 02:06:46 当尘埃落定时
我要自动判定某个类别下面有多少层子类,并把这些子类全部显示出来

2003-04-27 02:03:11  可爱的小狐


2003-04-27 02:07:19 当尘埃落定时
难吧

2003-04-27 02:03:52  可爱的小狐
还是有办法的吧...

2003-04-27 02:08:03 当尘埃落定时
因为子类里面又有子类,谁也不知道要多少次循环,所以自己调用自己是正确的

2003-04-27 02:08:37 当尘埃落定时
就是在函数里面调用自己的思路,是正确的,会产生一个自动的循环

2003-04-27 02:12:39 当尘埃落定时
function GetChild($class_id){
global $g_cDBBGS;
$sql = "select class_id,class_name,class_level from class where parent_class_id = $class_id and class_id <> 1";
echo $sql."\n";
$g_cDBBGS->query($sql);
while($g_cDBBGS->next_record())
{
$class_id = $g_cDBBGS->f(class_id);
$class_name = $g_cDBBGS->f(class_name);
$class_level = $g_cDBBGS->f(class_level);
echo "<option value=$class_id>".addSpace($class_level)."$class_name</option>\n";
//$result = $result.addSpace($class_level).$class_id.$class_name."<BR>\n";
GetChild($class_id);
//select class_id,class_name,class_level from class where parent_class_id = 1 and class_id <> 1
//select class_id,class_name,class_level from class where parent_class_id = 2 and class_id <> 1
//select class_id,class_name,class_level from class where parent_class_id = 3 and class_id <> 1
//select class_id,class_name,class_level from class where parent_class_id = 7 and class_id <> 1
//当做完parent_class_id = 7时,结果集$g_cDBBGS应该读取next_record(),再次循环,但是这个程序没有再次循环
//怀疑是结果集被重写了,因此需要有一个自动建立数据库对象的思路,现在还没有想到
}
}

2003-04-27 02:10:56  可爱的小狐
嗯,思路比较难想...

2003-04-27 02:15:59 当尘埃落定时
这种显示分类和一般的不一样的,一般的比如最多三层,我就手工写三个循环也就是了

2003-04-27 02:12:12  可爱的小狐
您好,我已经下班哦!我上班的时候会与你联系的!抱歉!

2003-04-27 02:16:09 当尘埃落定时
SHIT

2003-04-27 02:12:51  可爱的小狐
没什么头绪...

2003-04-27 02:32:20 当尘埃落定时
有眉目么?
(通过服务器中转)

2003-04-27 02:32:35 当尘埃落定时
我手工写三层循环就没有问题
(通过服务器中转)

2003-04-27 02:28:49  可爱的小狐
没有,在想...

2003-04-27 02:29:11  可爱的小狐
呵呵,多了你不就累死了吗?

2003-04-27 02:34:04 当尘埃落定时
对啊,所以嘛,技术难点就在这里哦,和你以前写的不一样吧

2003-04-27 02:31:02  可爱的小狐
对哦,我只要显示当前的一层就可以了,这是个好题目哦,有搞头....

2003-04-27 02:38:30 当尘埃落定时
最郁闷的是,不知道为什么我只能显示单线的目录

2003-04-27 02:35:09  可爱的小狐
呵呵,我现在就是弄不明这个问题哦

2003-04-27 02:40:20 当尘埃落定时
我想了两天了,才通过自己调用自己实现显示单线目录树上
真辛苦,明天继续想,我去睡觉,你慢慢郁闷

2003-04-27 02:36:57  可爱的小狐
想到了把程序给我,呵呵

2003-04-27 02:41:47 当尘埃落定时
难哦,做出来了自然是要共享,但是现在先要想,到星期一我们还是都想不出来的话,就去郁闷小陶

2003-04-27 02:38:19  可爱的小狐
同意...

2003-04-27 02:42:38 当尘埃落定时
这个功能做完,我这边网站的技术攻关就完成了1/3!

2003-04-27 02:39:15  可爱的小狐
好吧,我再想想....bye


2003-04-27 02:43:09 当尘埃落定时
恩 8




[此贴被 晓澜(group) 在 04月27日03时50分 编辑过]

地主 发表时间: 04/27 02:42

回复: NetDemon [netdemon]   ADMIN   登录
用LDAP就行了

B1层 发表时间: 04/27 02:54

回复: NetDemon [netdemon]   ADMIN   登录
这种情况使用文本保存数据具有最好效率,最容易实现的代码

如局限于sql+php
就取得最深目录数然后for,for中判断当前是否有下一目录
就是说在你的函数外边加一个for


B2层 发表时间: 04/27 04:20

回复: SysHu0teR [syshunter]   版主   登录
class_id(parent_class_id){
 查询;
 得到分类目录;
if parent_class_id中有子分类{
 打印所有子分类;
 class_id(总分类->子分类);
 }
这只是一个打印分类的递归思路,具体实现起来~``



[此贴被 SysHu0teR(syshunter) 在 04月27日11时16分 编辑过]

B3层 发表时间: 04/27 11:36

回复: group [group]   论坛用户   登录
就是要具体的实现,很难的
LDAP本身做不了递归吧,还是要自己写

我今晚先试试用数组

B4层 发表时间: 04/27 19:34

回复: ricky [ricky]   版主   登录
我对数据库不太明了,不过这种东西用递归最合适。用循环好像不太好控制

B5层 发表时间: 04/28 08:43

回复: group [group]   论坛用户   登录
用循环做不了的
我有新成果
代码:

//-----------------------------------------------------------------------------------
//根据层数增加空格
//-----------------------------------------------------------------------------------
function addSpace($class_level)
{
for($i=0;$i<$class_level;$i++)
{
$space = $space." ";
}
return $space;
}
//-----------------------------------------------------------------------------------
//获得分类数组
//-----------------------------------------------------------------------------------

function GetChild(){
global $g_cDBBGS;
$sql = "select class_id,parent_class_id,class_name,class_level from class where class_id <> 1";
//echo $sql."\n";
$g_cDBBGS->query($sql);
$i = 0;
while($g_cDBBGS->next_record())
{
$class_info[$i][class_id] = $g_cDBBGS->f(class_id);
$class_info[$i][parent_class_id] = $g_cDBBGS->f(parent_class_id);
$class_info[$i][class_name] = $g_cDBBGS->f(class_name);
$class_info[$i][class_level] = $g_cDBBGS->f(class_level);
$class_info[$i][showed] = 0;
$i++;
}
return $class_info;
}

//-----------------------------------------------------------------------------------
//获得子类(分析数组)
//-----------------------------------------------------------------------------------
function ShowClasses($class_info){
$total_class = count($class_info);
//echo "\$class_info[\$class_level][\$parent_class_id][\$class_id]<BR>\n";
//echo $ct_class_level."<BR>\n";
echo "showed \$i \$j class_level class_id parent_class_id class_name<BR>\n";
for($i=0;$i<$total_class;$i++){
if($class_info[$i][showed] == 0)
{
$class_info[$i][showed] = 1;
echo "循环外".$class_info[$i][showed]." ".$i." ".$j." ".$class_info[$i][class_level]." ".$class_info[$i][class_id]." ".$class_info[$i][parent_class_id]." ".addSpace($class_info[$i][class_level]).$class_info[$i][class_name]."<BR>\n";

for($j=0;$j<$total_class;$j++){
if($class_info[$j][parent_class_id] == $class_info[$i][class_id] && $class_info[$j][showed] == 0)
{
$class_info[$j][showed] = 1;
echo "循环内".$class_info[$j][showed]." ".$i." ".$j." ".
$class_info[$j][class_level]." ".$class_info[$j][class_id]." ". $class_info[$j][parent_class_id]." ".addSpace($class_info[$j][class_level]).
$class_info[$j][class_name]."<BR>\n";
}
}
}
}
}


谁能把ShowClasses改成一个递归?帮帮忙,我已经糊涂了


[此贴被 晓澜(group) 在 04月28日14时44分 编辑过]

B6层 发表时间: 04/28 12:57

回复: group [group]   论坛用户   登录
数组的话,老实和尚帮忙啊,这个就完全和数据库无关了!

B7层 发表时间: 04/28 12:59

回复: NetDemon [netdemon]   ADMIN   登录
变态佬!
一开始就在聊天室和你说用数组,你说数组不行,要用循环,只要知道多少循环就行了,现在又说循环不行,要用数组,不知道等一下给你解决了你又说要用啥的了

下面为本论坛数据库的列表文本,因为这个是文本,所以很方便的增加子类,在适当的位置加入就行了。运行的时候也是读入数组。你非用SQL也不外是增加一个可以让得到位置的标示就行了。
我已经测试过,我随便增加一个子类,不管在那级。都能一按进入精华区就全部所有之类显示出来,甚至同时把帖子都显示出来也可以的。而且方法不只一种。你都可以想到根据层数增加空格了,应该快成功了,多多努力^_^

#根目录
##安全基地
###菜鸟乐园
###黑客进阶
###病毒专区
###UNIX系统
##电脑技术
###网吧专题
###编程破解
###网站建设
###电脑门诊
###硬件天空
###网络集成
##非技术性文章
###轻松一刻
###一池萍碎
###民谣音乐
###茶余饭后
##站务管理区

PS:使用LDAP的话你根本就不需要这个表了,也不需要计算了,直接打印出来就已经是你要的东东了,就像dir /a:d /s 一样了

B8层 发表时间: 04/28 14:44

回复: group [group]   论坛用户   登录
MD,你就不能写一个递归给我?
知道你的思路了,不错,我试试,MD

B9层 发表时间: 04/28 14:50

回复: group [group]   论坛用户   登录
问题已经解决,没有用数组和文件,直接递归查询数据库,效率不低
表结构
class_id  parent_class_id  class_name  class_level 

代码
代码:

//-----------------------------------------------------------------------------------
//根据层数增加空格
//-----------------------------------------------------------------------------------
function addSpace($class_level)
{
//$space = "";
for($i=2;$i<$class_level;$i++)
{
$space = $space." ";
}
return $space;
}

//-----------------------------------------------------------------------------------
//递归获得目录树
//-----------------------------------------------------------------------------------
function ShowClasses($level,$parent_class_id){
//global $g_cDBBGS;
$g_cDBBGS[$level] = new dbconn;

$sql = "select class_id,class_name,parent_class_id,class_level from class where length(class_level)/3 = $level and parent_class_id = $parent_class_id";
//echo $sql."<BR>\n";
$g_cDBBGS[$level]->query($sql);
//echo $g_cDBBGS->nr()."<BR>\n";
while($g_cDBBGS[$level]->next_record())
{
$class_id = $g_cDBBGS[$level]->f(class_id);
$class_name = $g_cDBBGS[$level]->f(class_name);
$parent_class_id = $g_cDBBGS[$level]->f(parent_class_id);
$class_level = $g_cDBBGS[$level]->f(class_level);

echo "<option value=$class_id>".addSpace($level)." ".$class_name."</option>\n";
$level_ct = $level + 1;
ShowClasses($level_ct,$class_id);
}
}




B10层 发表时间: 04/29 00:29

回复: quest [quest]   版主   登录
以后谁把聊天记录帖出来我跟谁没完!!!!
什么东西嘛。看着头痛...我根本就看不下去。。。


B11层 发表时间: 04/29 08:34

回复: meady [meady]   论坛用户   登录
如果真的考虑无限目录的话,我觉得最好能非递归话,递归太耗资源
真的有必要一下把所有结构都读出来吗

B12层 发表时间: 04/30 20:30

回复: signal [signal]   论坛用户   登录
有必要,为了减少你脑细胞的死亡率,递归不失为一个好办法。算法开销方面并不是很大,只是一个堆栈的大小问题。比循环在时间复杂度上小多了。

B13层 发表时间: 05/01 19:32

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号