PHP 板


LINE

看板 PHP  RSS
※ 引述《xamous (一天死去一点)》之铭言: : 我有一个树状的资料储存在资料库里,结构大概是这样 : id, title, parent : root 的 parent 是 0,id 是 1 你可以将它简化为 parent 0, id 0, 就是自己当自己的 parent, 另外, 0 也是唯一会被当成 false 的数字 (应该啦), 所以这能够让程式码也更加简洁 : 1 root 0 : 2 同学 1 : 3 朋友 1 : 4 大学 2 : 5 高中 2 : 我希望他在网页上能够显示成 : root : * 同学 : * 大学 : * 高中 : * 朋友 : 可是就是想不到有什麽简单有效的方法来处理这样的资料,请问各位前辈有 我最近做过类似的东西, 提供给你参考. 不过只是跑跑递回或回圈而已. 记得要将 id 设为 primary, parent 设 index, 并且这个资料表不要加入非必要栏位 (喔, 除了这三个大概都算非必要了) 1. 建立 $tree = array() ; 取得 root_id (0 or 1) 并取得所有资料至 php 变数中 (例如 $buff) (如果你的资料量很大, 那麽就要以 DB query 次数来当作 trade off, 不过原理是相同的) 对 $buff 这个变数来说, 也许它会长这样 (也以此为例) $buff[0]['id'] = 1 $buff[0]['title'] = "root" $buff[0]['parent'] = 0 而我希望 $tree 会长成这样: $tree = array(....) $tree[1]['title'] = "root" $tree[1]['type'] = "node" // 你很可能在枝下又生叶 $tree[1][2] = array(....) $tree[1][2]['title'] = "同学" $tree[1][2]['type'] = "node" 你能够再使用一个阵列, 包含了 $tree 内的元素之 reference, 以利资料的操作. $myindex = array() 2. 接着开始对 $buff 跑无穷回圈, 直到 "某一圈跑完都无法丢出新资料" 为止. 回圈开头要先 reset ($buff), 之後使用 foreach 去里头读资料 对於 $buff 内的每个元素 $item (这时候的 key 不重要. 那只是被 select 出 的顺序而已. 把它叫出来只是删除方便), 我会先在 $myindex 建立其 reference, 再将其 ref 到 $tree 内该有的位置, 最後将原资料 unlink, 并 break foreach 回圈, continue 外部 while 回圈. 大致程式码如下: $buff ; // you should prepare this. $myindex = array() ; $tree = array() ; // building root reset($buff) ; foreach($buff as $key=>$item) if ($item['id'] == 1){ $myindex[1] = &$item ; $tree = &$item ; unset($buff[$key]) ; } do { $noNew = true ; reset($buff) ; foreach($buff as $key => $item) if (isset($myindex[$item['parent']])){ $myindex[$item['id']] = &$item ; $myindex[$item['parent']][$item['id']] = &$item ; unset($buff[$key]) ; $noNew = false ; break ; } } loop while (!$noNew) ; // ending the main while loop 以上码未测试, 不过除了打错字外应该可行. -- 鬼压床怎麽办 骑上去啊 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.217.134
1F:推 taiwancat:建议改用物件 会比较好维护 也较容易思考 11/08 20:52
2F:推 xamous:呀~感谢大家 :D 11/08 21:27
3F:推 clifflu:但物件在 new/del 以及 reference 使用上 会比阵列复杂. 11/08 22:24
4F:推 clifflu:并且当资料量很大 又未至记忆体负荷不了时 差异会更明显 11/09 01:20
5F:推 lixc:物件导向并不会增加程式的Performance 还是乖乖用参考+阵列 11/11 23:19







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP