关于排序的问题
现在有一个分类表包含如下字段
- id
- parentid 父id
- order 该项在其所处层级的显示顺序,值越小越靠前
- text 内容
比如像下边这样的数据(text 字段内容只是为了方便说明才这么写,实际内容不是这样):
id | parentid | order | text |
---|---|---|---|
1 | 0 | 10 | 1 |
2 | 0 | 0 | 2 |
3 | 1 | 20 | 1-2 |
4 | 1 | 10 | 1-1 |
5 | 3 | 20 | 1-2-2 |
6 | 3 | 10 | 1-2-1 |
7 | 2 | 30 | 2-1 |
如何将其排序为(大体是按 parentid 和 order 排序)
id | parentid | order | text |
---|---|---|---|
2 | 0 | 0 | 2 |
7 | 2 | 30 | 2-1 |
1 | 0 | 10 | 1 |
4 | 1 | 10 | 1-1 |
3 | 1 | 20 | 1-2 |
6 | 3 | 10 | 1-2-1 |
5 | 3 | 20 | 1-2-2 |
简单来说就是一个无限分类的子分类排序问题。先按照 父子分类排序,再将 所有同级分类按照 order 排序。
我目前用的是最笨的方法,就是将 每层分类单独读取出来(递归),排序好后在插入到总数组中,而且目前只测试了对3级分类的支持, 但是感觉这种效率好低啊,不知道有没有什么好的算法,望大神帮忙,或指点一二,做好基于php。
朝天椒甜不辣
9 years, 9 months ago
Answers
查询的时候,全部查询出来,只对
order
进行排序
一次遍历构造数组
$data = array();
foreach ($rows as $r) {
$data['item'][$r['id']] = $r;
$data['parent'][$r['id']] = $r['pid'];
$data['children'][$r['pid']][] = $r['id'];
}
使用的时候一般遍历
data['children'][当前需要遍历的父ID]
,再通过
data['item'][当前ID]
找到指定的条目
求不遇见喷子
迎风流泪君
answered 9 years, 9 months ago