本文实例讲述了php+mysql查询实现无限下级分类树输出。分享给大家供大家参考,具体如下:
这里介绍的php结合mysql查询无限下级树输出,其实就是无限分类。给各位整理了几个php无限分类的例子.
树输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
function get_array( $user_id , $top =0){
global $mysql , $_G ;
$sql = "select user_id as name from `{spreads_users}` where p1.spreads_userid='{$user_id}'" ;
$rows = $mysql ->db_fetch_arrays( $sql );
if ( $top ==1){
$arr [0][ 'name' ]= $user_id ;
$arr [0][ 'children' ]= array ();
}
$top = $top +1;
foreach ( $rows as $key => $value )
{
$r = get_array( $value [ 'name' ]); //调用函数,传入参数,继续查询下级
$arr [0][ 'children' ][ $key ][ 'name' ]= $value [ 'username' ]; //组合数组
if ( is_array ( $r )){
$arr [0][ 'children' ][ $key ][ 'children' ]= $r [0][ 'children' ];
}
$i ++;
}
return $arr ;
}
$list = get_array( "1000" ,1); //调用函数1000是*ID
echo 'var data=' .json_encode( $list );
|
这个是输出 Array 然后转让为 json
例子:
表结构:id字段为分类标识,name字段为分类名,father_id字段为所属父分类的id,path字段为分类路径,储存该分类祖先的集合,isdir判断是否是目录,1为是,0为否.
显示函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
//$count为分类等级
sort_list( $str , $fatherid , $count )
{
$rs = $this ->sql->re_datas( "select * from sort where father_id = fatherid" );
$num = $this ->sql->sql_numrows();
$i =0;
$n = 1;
while (isset( $rs [ $i ]))
{
$name = "" ;
for ( $n = 1 ; $n < $count ; $n )
{
$name .= "│ " ;
}
if ( $i 1== $num )
{
$name .= "└─" . $rs [ $i ][name];
}
else
{
$name .= "├─" . $rs [ $i ][name];
}
if ( $rs [ $i ][isdir])
{
$str .= "<span style='color:#CCCCCC'>" . $name . "</span>" ;
}
else
{
$str .= $name ";
}
$temp = $count 1;
$str = $this ->sort_list( $str , $rs [ $i ][id], $temp );
$i ;
}
return $str ;
}
|
其中$this->sql对象为sql操作类对象,re_datas()函数返回查到的数组,sql_numrows()函数返回查询到的数目.
调用方法:
1
|
$sort_list = sort_list( $sort_list ,0,1);
|
例子:
表:category
id int 主键,自增
name varchar 分类名称
pid int 父类id,默认0
*分类的 pid 默认就是0了,当我们想取出某个分类的子分类树的时候,基本思路就是递归,当然,出于效率问题不建议每次递归都查询数据库,通常的做法是先讲所有分类取出来,保存到PHP数组里,再进行处理,最后还可以将结果缓存起来以提高下次请求的效率.
先来构建一个原始数组,这个直接从数据库中拉出来就行:
1
2
3
4
5
6
7
8
9
10
|
$categories = array (
array ( 'id' =>1, 'name' => '电脑' , 'pid' =>0),
array ( 'id' =>2, 'name' => '手机' , 'pid' =>0),
array ( 'id' =>3, 'name' => '笔记本' , 'pid' =>1),
array ( 'id' =>4, 'name' => '台式机' , 'pid' =>1),
array ( 'id' =>5, 'name' => '智能机' , 'pid' =>2),
array ( 'id' =>6, 'name' => '功能机' , 'pid' =>2),
array ( 'id' =>7, 'name' => '超级本' , 'pid' =>3),
array ( 'id' =>8, 'name' => '游戏本' , 'pid' =>3),
);
|
目标是将它转化为下面这种结构:
1
2
3
4
5
6
7
8
|
电脑
—笔记本
——-超级本
——-游戏本
—台式机
手机
—智能机
—功能机
|
用数组来表示的话,可以增加一个 children 键来存储它的子分类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
array(
//1对应id,方便直接读取
1 => array(
'id' =>1,
'name' => '电脑' ,
'pid' =>0,
children=>array(
&array(
'id' =>3,
'name' => '笔记本' ,
'pid' =>1,
'children' =>array(
//此处省略
)
),
&array(
'id' =>4,
'name' => '台式机' ,
'pid' =>1,
'children' =>array(
//此处省略
)
),
)
),
//其他分类省略
)
|
处理过程:
1
2
3
4
5
6
7
8
9
10
11
12
|
$tree = array ();
//第一步,将分类id作为数组key,并创建children单元
foreach ( $categories as $category ){
$tree [ $category [ 'id' ]] = $category ;
$tree [ $category [ 'id' ]][ 'children' ] = array ();
}
//第二部,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。
foreach ( $tree as $k => $item ) {
if ( $item [ 'pid' ] != 0) {
$tree [ $item [ 'pid' ]][ 'children' ][] = & $tree [ $k ];
}
}
|
print_r($tree);打印结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
Array
(
[1] => Array
(
[id] => 1
[name] => 电脑
[pid] => 0
[children] => Array
(
[0] => Array
(
[id] => 3
[name] => 笔记本
[pid] => 1
[children] => Array
(
[0] => Array
(
[id] => 7
[name] => 超级本
[pid] => 3
[children] => Array
(
)
)
[1] => Array
(
[id] => 8
[name] => 游戏本
[pid] => 3
[children] => Array
(
)
)
)
)
[1] => Array
(
[id] => 4
[name] => 台式机
[pid] => 1
[children] => Array
(
)
)
)
)
[2] => Array
(
[id] => 2
[name] => 手机
[pid] => 0
[children] => Array
(
[0] => Array
(
[id] => 5
[name] => 智能机
[pid] => 2
[children] => Array
(
)
)
[1] => Array
(
[id] => 6
[name] => 功能机
[pid] => 2
[children] => Array
(
)
)
)
)
[3] => Array
(
[id] => 3
[name] => 笔记本
[pid] => 1
[children] => Array
(
[0] => Array
(
[id] => 7
[name] => 超级本
[pid] => 3
[children] => Array
(
)
)
[1] => Array
(
[id] => 8
[name] => 游戏本
[pid] => 3
[children] => Array
(
)
)
)
)
[4] => Array
(
[id] => 4
[name] => 台式机
[pid] => 1
[children] => Array
(
)
)
[5] => Array
(
[id] => 5
[name] => 智能机
[pid] => 2
[children] => Array
(
)
)
[6] => Array
(
[id] => 6
[name] => 功能机
[pid] => 2
[children] => Array
(
)
)
[7] => Array
(
[id] => 7
[name] => 超级本
[pid] => 3
[children] => Array
(
)
)
[8] => Array
(
[id] => 8
[name] => 游戏本
[pid] => 3
[children] => Array
(
)
)
)
|
优点:关系清楚,修改上下级关系简单.
缺点:使用PHP处理,如果分类数量庞大,效率也会降低.
希望本文所述对大家PHP程序设计有所帮助。