一个PHP无限极分类显示问题

xiaditao2008 2009-09-10 05:34:57
我很久都没有实现出来,那位大哥帮帮忙


数据库表: clss

id position name
1 1 电脑
2 2 手机
3 1>3> HP
4 1>4> DELL
5 2>5> 诺基亚
6 2>6> 三星
7 1>3>7> HP台式
8 1>3>8> HP笔记本
9 1>3>9> DELL笔记本
10 1>3>10> DELL台式
11 2>4>11> 诺基亚直板
12 2>4>12> 诺基亚滑盖
13 2>4>13> 三星直板
14 2>4>14> 三星滑盖

…… …… ……


上面是我数据库
我要通过这个数据库在WEB页面实现效果


电脑 手机
>HP >诺基亚
>>HP台式 >>诺基亚直板
>>HP笔记本 >>诺基亚滑盖
>DELL >三星
>>DELL台式 >>三星直板
>>DELL笔记本 >> 三星滑盖
…… ……
...全文
1018 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
garcon1986 2009-11-02
  • 打赏
  • 举报
回复
这个树不是动态的吧?? 有没有实现动态树的方法吗???

江南昆虫 2009-09-11
  • 打赏
  • 举报
回复
另外建议position中用“,”取代“>”,因为这样可以很方便利用find_in_set查找某类别的所有父类或子类。

mysql> select * from t_xiaditao2008 t;
+----+-----+----------+------------+
| id | pid | position | name |
+----+-----+----------+------------+
| 1 | 0 | 1 | 电脑 |
| 2 | 0 | 2 | 手机 |
| 3 | 1 | 1,3 | HP |
| 4 | 1 | 1,4 | DELL |
| 5 | 2 | 2,5 | 诺基亚 |
| 6 | 2 | 2,6 | 三星 |
| 7 | 3 | 1,3,7 | HP台式 |
| 8 | 3 | 1,3,8 | HP笔记本 |
| 9 | 4 | 1,4,9 | DELL笔记本 |
| 10 | 4 | 1,4,10 | DELL台式 |
| 11 | 5 | 2,5,11 | 诺基亚直板 |
| 12 | 5 | 2,5,12 | 诺基亚滑盖 |
| 13 | 6 | 2,6,13 | 三星直板 |
| 14 | 6 | 2,6,14 | 三星滑盖 |
+----+-----+----------+------------+
14 rows in set (0.09 sec)

手机及其下所有子类别
mysql> select * from t_xiaditao2008 t where find_in_set(2,position);
+----+-----+----------+------------+
| id | pid | position | name |
+----+-----+----------+------------+
| 2 | 0 | 2 | 手机 |
| 5 | 2 | 2,5 | 诺基亚 |
| 6 | 2 | 2,6 | 三星 |
| 11 | 5 | 2,5,11 | 诺基亚直板 |
| 12 | 5 | 2,5,12 | 诺基亚滑盖 |
| 13 | 6 | 2,6,13 | 三星直板 |
| 14 | 6 | 2,6,14 | 三星滑盖 |
+----+-----+----------+------------+
7 rows in set (0.00 sec)

HP笔记本及其所有父类别
mysql> select t.* from t_xiaditao2008 t,t_xiaditao2008 x where x.id=8 and find_i
n_set(t.id,x.position);
+----+-----+----------+----------+
| id | pid | position | name |
+----+-----+----------+----------+
| 1 | 0 | 1 | 电脑 |
| 3 | 1 | 1,3 | HP |
| 8 | 3 | 1,3,8 | HP笔记本 |
+----+-----+----------+----------+
3 rows in set (0.00 sec)
江南昆虫 2009-09-11
  • 打赏
  • 举报
回复
数据库:

mysql> SELECT * FROM t_xiaditao2008 t;
+----+-----+----------+------------+
| id | pid | position | name |
+----+-----+----------+------------+
| 1 | 0 | 1 | 电脑 |
| 2 | 0 | 2 | 手机 |
| 3 | 1 | 1,3 | HP |
| 4 | 1 | 1,4 | DELL |
| 5 | 2 | 2,5 | 诺基亚 |
| 6 | 2 | 2,6 | 三星 |
| 7 | 3 | 1,3,7 | HP台式 |
| 8 | 3 | 1,3,8 | HP笔记本 |
| 9 | 4 | 1,4,9 | DELL笔记本 |
| 10 | 4 | 1,4,10 | DELL台式 |
| 11 | 5 | 2,5,11 | 诺基亚直板 |
| 12 | 5 | 2,5,12 | 诺基亚滑盖 |
| 13 | 6 | 2,6,13 | 三星直板 |
| 14 | 6 | 2,6,14 | 三星滑盖 |
+----+-----+----------+------------+
14 rows in set (0.02 sec)


php:

<pre>
<?php
$rs = mysql_query('select * from t_xiaditao2008 order by position;');
$arr_pid = array();
while ($row = mysql_fetch_array($rs,MYSQL_ASSOC)) {
if (in_array($row['pid'],$arr_pid)) {
$deep = array_search($row['pid'],$arr_pid)+1;
$arr_pid = array_chunk($arr_pid,$deep);
$arr_pid = $arr_pid[0];
echo str_repeat(" ",$deep);
echo str_repeat(">",$deep);
} else {
unset($arr_pid);
echo "---------------\n";
}
echo $row['name']."\n";
$arr_pid[] = $row['id'];
}
?>
</pre>


输出结果:

---------------
电脑
>HP
>>HP台式
>>HP笔记本
>DELL
>>DELL台式
>>DELL笔记本
---------------
手机
>诺基亚
>>诺基亚直板
>>诺基亚滑盖
>三星
>>三星直板
>>三星滑盖
xuzuning 2009-09-11
  • 打赏
  • 举报
回复
读出全部记录后用程序处理

$s = <<< DATA
1 1 电脑
2 2 手机
3 1>3> HP
4 1>4> DELL
5 2>5> 诺基亚
6 2>6> 三星
7 1>3>7> HP台式
8 1>3>8> HP笔记本
9 1>3>9> DELL笔记本
10 1>3>10> DELL台式
11 2>4>11> 诺基亚直板
12 2>4>12> 诺基亚滑盖
13 2>4>13> 三星直板
14 2>4>14> 三星滑盖
DATA;

function foo($v) {
return split(" +", trim($v));
}
$a = array_map('foo', split("[\r\n]+", $s));
$o = array();
$i=3;
foreach($a as $v) {
$p = '[' . str_replace('>', '][', trim($v[1], '>')).'][name]';
eval("\$o$p = \$v[2];");
}
print_r($o);

就得到这样的数组
Array
(
[1] => Array
(
[name] => 电脑
[3] => Array
(
[name] => HP
[7] => Array
(
[name] => HP台式
)

[8] => Array
(
[name] => HP笔记本
)

[9] => Array
(
[name] => DELL笔记本
)

[10] => Array
(
[name] => DELL台式
)

)

[4] => Array
(
[name] => DELL
)

)

[2] => Array
(
[name] => 手机
[5] => Array
(
[name] => 诺基亚
)

[6] => Array
(
[name] => 三星
)

[4] => Array
(
[11] => Array
(
[name] => 诺基亚直板
)

[12] => Array
(
[name] => 诺基亚滑盖
)

[13] => Array
(
[name] => 三星直板
)

[14] => Array
(
[name] => 三星滑盖
)

)

)

)


接下来的事情就好办了吧?
由于这种分类列表并不是经常变化的,只在发生变化时执行并缓存就可以了。不必太考虑效率问题
YHL27 2009-09-11
  • 打赏
  • 举报
回复
顶!!
江南昆虫 2009-09-11
  • 打赏
  • 举报
回复
增加一个父类别编号,然后order by position

mysql> SELECT * FROM t_xiaditao2008 t;
+----+-----+----------+------------+
| id | pid | position | name |
+----+-----+----------+------------+
| 1 | 0 | 1 | 电脑 |
| 2 | 0 | 2 | 手机 |
| 3 | 1 | 1,3 | HP |
| 4 | 1 | 1,4 | DELL |
| 5 | 2 | 2,5 | 诺基亚 |
| 6 | 2 | 2,6 | 三星 |
| 7 | 3 | 1,3,7 | HP台式 |
| 8 | 3 | 1,3,8 | HP笔记本 |
| 9 | 4 | 1,4,9 | DELL笔记本 |
| 10 | 4 | 1,4,10 | DELL台式 |
| 11 | 5 | 2,5,11 | 诺基亚直板 |
| 12 | 5 | 2,5,12 | 诺基亚滑盖 |
| 13 | 6 | 2,6,13 | 三星直板 |
| 14 | 6 | 2,6,14 | 三星滑盖 |
+----+-----+----------+------------+
14 rows in set (0.02 sec)

mysql> SELECT * FROM t_xiaditao2008 t order by position;
+----+-----+----------+------------+
| id | pid | position | name |
+----+-----+----------+------------+
| 1 | 0 | 1 | 电脑 |
| 3 | 1 | 1,3 | HP |
| 7 | 3 | 1,3,7 | HP台式 |
| 8 | 3 | 1,3,8 | HP笔记本 |
| 4 | 1 | 1,4 | DELL |
| 10 | 4 | 1,4,10 | DELL台式 |
| 9 | 4 | 1,4,9 | DELL笔记本 |
| 2 | 0 | 2 | 手机 |
| 5 | 2 | 2,5 | 诺基亚 |
| 11 | 5 | 2,5,11 | 诺基亚直板 |
| 12 | 5 | 2,5,12 | 诺基亚滑盖 |
| 6 | 2 | 2,6 | 三星 |
| 13 | 6 | 2,6,13 | 三星直板 |
| 14 | 6 | 2,6,14 | 三星滑盖 |
+----+-----+----------+------------+
14 rows in set (0.00 sec)
onion1982 2009-09-11
  • 打赏
  • 举报
回复
厉害!佩服!
xiaditao2008 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sindel 的回复:]
类别 里有个 表示父类的字段,构造成树
搜索某个结点时找出子树,使用递归由父结点展开树,补补数据结构吧
[/Quote]、
具体怎么补数据结构,我已经没有思路了
sindel 2009-09-10
  • 打赏
  • 举报
回复
类别 里有个 表示父类的字段,构造成树
搜索某个结点时找出子树,使用递归由父结点展开树,补补数据结构吧
hotup 2009-09-10
  • 打赏
  • 举报
回复
这个最主要的是数库设计, 不是一句二句就说得清的
xiaditao2008 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tfxg 的回复:]
用個遞歸查詢就行了
[/Quote]
如何循环查询 我循环了好几种方法都没有实现出来,可否给点具体提示
谢谢了
tfxg 2009-09-10
  • 打赏
  • 举报
回复
用個遞歸查詢就行了

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧