现在有一个分类表包含如下字段
- 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。
数据结构:为所有顶级分类设置一个虚拟的父分类,然后每个分类有一个指向其已序子分类数组的引用。
排序操作:在每个节点上执行获取所有子分类并排序后保存到一个数组中的操作。
如果非得要放在同一个数组中,那就在排序完成以后再把结果按顺序放到一个数组里。
当然,我还是建议修改读取数组的方法,让它能够解析树形结构。