算法苦逼,求一个最佳方案

2012 年 12 月 17 日
 iloveyou
是关于php和mysql的。

从一个items里读出多条记录,字段为 id, title,parent_id。其中parent_id关联其他记录的id,如果没有关联parent_id默认为0。比如如下几条记录:

id title parent_id
1 title1 0
2 title2 0
3 title3 1
4 title4 2

请问如何最优雅的转化成这种json格式:

[
{id:1, title:title1, parent_id:0, child:[{id:3,title:title3,parent_id:1}]}
{id:2, title:title2, parent_id:0, child:[{id:4,title:title4,parent_id:2}]}
]

其实就是把子条目塞进父条目里,我的想法是要用两个循环先把父条目读出,然后再循环子条目塞进父条目里。哪位大神能用一个循环解决掉?
6081 次点击
所在节点    PHP
21 条回复
talentsnail
2012 年 12 月 17 日
$result = mysql_query("SELECT * FROM iterms");
while ( $one = mysql_fetch_array($result) ) {
if ($one['parent_id'] == 0){
创建一个新条目;
}
else {
把该条目添加到 id == $one['parent_id']的条目;
}
}

哈哈,刚刚开始学编程,所以,大神别笑^_^
Brutal
2012 年 12 月 17 日
http://gist.github.com/4315906

可能有误,好久没写 PHP 了
iloveyou
2012 年 12 月 17 日
@talentsnail
@Brutal
你两的方法差不多,其实这种我也想过,但是遇到点其他问题,所以弄成两个循环
Brutal
2012 年 12 月 17 日
@iloveyou 什么问题?
iloveyou
2012 年 12 月 17 日
主要是格式化的问题
halida
2012 年 12 月 17 日
我还以为是算法时间优化嘞,原来只是语法层面的。。。
enj0y
2012 年 12 月 17 日
后面使用$json_data=json_encode($array)即可将数组转换成json数据。
isy
2012 年 12 月 17 日
@iloveyou 组织好 array 再用 josn_encode 不行么?
iloveyou
2012 年 12 月 17 日
@halida 是啊 不入大神们的法眼

@isy 是啊 可以
iloveyou
2012 年 12 月 17 日
@talentsnail
@Brutal

想的太简单了,如果子项先被循环怎么办?
lychee
2012 年 12 月 17 日
@iloveyou 想的太复杂了,加上order by "parent_id" ASC 不就行了
iloveyou
2012 年 12 月 17 日
@lychee 那要是我有其他排序呢,不是被打乱了?
aveline
2012 年 12 月 17 日
aveline
2012 年 12 月 17 日
aveline
2012 年 12 月 17 日
Gist 不能发了么...

gist.github.com/e4cf4feea0faeddc2c06
iloveyou
2012 年 12 月 17 日
@aveline 好的 明天我看看
iloveyou
2012 年 12 月 18 日
@aveline 你这个也不行,你只提取parent_id为相同的一条
Just1n
2012 年 12 月 18 日
可以在数据库里加两个字段(如果可以动数据库的话,并且表确实是一个严格的树形):Lft,Rgt,都为int型。
记录如下:
id title parent_id Lft Rgt
0 title0 null 1 10
1 title1 0 2 5
2 title2 0 6 9
3 title3 1 3 4
4 title4 2 7 8

最底层节点永远是 Rgt-Lft==1
顶层节点永远是Lft==1
节点X的所有父节点为(假定目标节点为D):
D.Lft < X.Lft && D.Rgt > X.Rgt
节点X的所有子节点为(假定目标节点为D):
D.Lft > X.Lft && D.Rgt < X.Rgt

这样做的好处是,我只需要在更新表的时候做一次递归处理即可,其他时间无需递归,当然逻辑也比较清晰。
iloveyou
2012 年 12 月 18 日
@Just1n 晕啊 看着好高级啊,眼花。。。这是某种经典的算法吗?
Just1n
2012 年 12 月 18 日
@iloveyou 经不经典我还真不知道,因为我是属于半路出家,对数学算法数据结构也是菜。以上只是我以前遇到的组织架构的处理方案。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/55109

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX