无限
分类是PHP如何与MySQL结合的老话题。
第一种
方法 这是一种非常常见的传统方法,首先查看表结构。
表:catery
id主键,自增
名称varchar分类名称
默认的父类ID,默认为0
的顶级PID的默认值是0。当我们想拿出来的子分类树的分类,其基本思想是递归的,当然,这个问题是不
推荐用于每个递归
查询数据库的效率,通常的做法是谈都采取了分类,
保存在PHP数组,然后进行
处理,最后还可以缓存结果
提高效率的下一个请求。
首先,构建一个原始数组,该数组直接从数据库中提取出来。
复制代码代码如下所示:
美元=阵列(伙伴关系
阵列('id' = > 1,'name' = >计算机,'pid= > 0),
阵列('id' = > 2,'name' = > 'cell电话,'pid= > 0),
阵列('id' = > 3,'name' = > 'notebook,'pid= > 1),
阵列('id' = > 4,'name' = > 'desktop,'pid= > 1),
阵列('id' = > 5,'name' = > 'smartphones,'pid= > 2),
阵列('id' = > 6,'name' = > 'function,'pid= > 2),
阵列('id' = > 7,'name' = > 'superbook,'pid= > 3),
阵列('id' = > 8,'name' = > 'games ','pid= > 3),
);
目标是将其
转换为以下结构
电脑类
笔记本
该
游戏书
台式机
移动电话
智能机
功能机
在一个数组中,你可以添加一个孩子关键存储它的子类:
复制代码代码如下所示:
(阵列
1对应id,并且易于阅读。
(数组> 1)
id = 1,
名字= > 'computers,
PID=0,
子数组(
(阵列
id = 3,
名字= > 'notebook,
PID=1,
子数组(
在这里省略
)
),
(阵列
id = 4,
名字= > 'desktop,
PID=1,
子数组(
在这里省略
)
),
)
),
其他分类/省略
)
过程:
复制代码代码如下所示:
树=数组();
第一步,将其归类为id数组键,并
创建一个子单元。
foreach(合伙伴关系catery美元){
美元树{ $ catery { 'id' } } = $ catery;
美元树{ $ catery { } } { 'id'‘孩子'} =阵();
}
通过引用,每个分类都添加到父类子数组中,这样的遍历可以形成树结构。
foreach(美元美元美元树K = >项目){
如果($项{ 'pid}!= 0){
美元树{ $项{ } } { 'pid '孩子' } { } = { } $ K $树;
}
}
print_r(美元树);
打印结果如下:
复制代码代码如下所示:
阵列
(
{ 1 }数组
(
{ 1
{
计算机 { 0
{子数组
(
{ 0 }数组
(
{ 3
{笔记本
{ 1
{子数组
(
{ 0 }数组
(
{ 7
{这个超级的
名字 { 3
{子数组
(
)
)
{ 1 }数组
(
{ 8
{此游戏
{ 3
{子数组
(
)
)
)
)
{ 1 }数组
(
{ 4
{
桌面 { 1
{子数组
(
)
)
)
)
{ 2 }数组
(
{ 2
{移动电话
{ 0
{子数组
(
{ 0 }数组
(
{ 5
{智能机器
{ 2
{子数组
(
)
)
{ 1 }数组
(
{ 6
{
函数机器
{ 2
{子数组
(
)
)
)
)
{ 3 }数组
(
{ 3
{笔记本
{ 1
{子数组
(
{ 0 }数组
(
{ 7
{这个超级的名字
{ 3
{子数组
(
)
)
{ 1 }数组
(
{ 8
{此游戏
{ 3
{子数组
(
)
)
)
)
{ 4 }数组
(
{ 4
{桌面
{ 1
{子数组
(
)
)
{ 5 }数组
(
{ 5
{智能机器
{ 2
{子数组
(
)
)
{ 6 }数组
(
{ 6
{函数机器
{ 2
{子数组
(
)
)
{ 7 }数组
(
{ 7
{这个超级的名字
{ 3
{子数组
(
)
)
{ 8 }数组
(
{ 8
{此游戏
{ 3
{子数组
(
)
)
)
优点:关系清晰,很容易
修改上下级关系。
缺点:使用PHP处理,如果分类数量庞大,效率就会降低。
第二方法
此方法是在表字段中添加一个
路径字段:
表:catery
id主键,自增
名称varchar分类名称
默认的父类ID,默认为0
路径varchar路径
样本数据:
id路径
1计算机00
2手机00
3笔记本10-1
4超3的三
5游戏书3三
路径字段记录从根分类法到上层父类的路径,它用+表示。
这样,假设我们需要查询计算机下的所有子代,只有一个SQL语句:
Select id, name path, from catery where path like (select concat (path, -, ID, as path from catery where '%') id=1);
结果uff1a
+ -- + + + ----------- -------
ID名称路径| | | |
+ -- + + + ----------- -------
| 3 |笔记本| 0-1 |
4 | |超级|三|
5游戏的| | |三|
+ -- + + + ----------- -------
这种方法也被很多人采纳,我总结如下:
优点:查询方便,效率高,路径字段可索引。
缺点:更新节点关系
故障,需要更新路径域的所有子节点。
以上就是本文的全部内容,两种方式,你喜欢哪种我希望你能喜欢它。