我很久都没有实现出来,那位大哥帮帮忙
数据库表: 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笔记本 >> 三星滑盖
…… ……
数据库表: 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笔记本 >> 三星滑盖
…… ……
+----+-----+----------+------------+
| 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)
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] => 三星滑盖
) ) ))
接下来的事情就好办了吧?
由于这种分类列表并不是经常变化的,只在发生变化时执行并缓存就可以了。不必太考虑效率问题
+----+-----+----------+------------+
| 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笔记本
---------------
手机
>诺基亚
>>诺基亚直板
>>诺基亚滑盖
>三星
>>三星直板
>>三星滑盖
+----+-----+----------+------------+
| 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)