[請益] php 組成樹狀結構array請益

看板PHP作者 (Poky)時間5年前 (2019/01/23 20:18), 編輯推噓7(7030)
留言37則, 8人參與, 5年前最新討論串1/1
想請問 我mongodb有一樹狀結構資料 每筆資料都有 root_id -> string task_id -> string children -> array [child1, child2, ...] 由root_id 可以撈到一堆資料,代表由同一root_id 底下任務 每一個task_id 只知道他的children 第一層就是root_id = task_id 需要由他往下爬 現在問題是前端要顯示樹狀圖 需要資料結構如下 { root_id: { child1:{ child11:{ ...... } }, child2: { .... } } } 遞迴去爬所有資料是知道怎麼做, 但是不知道怎麼組成array 請各位大神提點一下 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.141.250 ※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1548245903.A.C80.html

01/23 21:24, 5年前 , 1F
小弟我聽你描述感覺像是要一個三維陣列?由小陣列到大
01/23 21:24, 1F

01/23 21:24, 5年前 , 2F
陣列依序是child11->child1->root_id這樣?
01/23 21:24, 2F

01/23 21:25, 5年前 , 3F
那child2的子陣列是child21嗎?
01/23 21:25, 3F

01/23 21:25, 5年前 , 4F
child3下面有child31這樣?
01/23 21:25, 4F

01/23 21:53, 5年前 , 5F
我大概瞭解你的意思了,但是我手邊沒有電腦可以示範..
01/23 21:53, 5F

01/23 21:53, 5年前 , 6F
.呃,你看看這個圖片,是不是你要的東西:https://i.i
01/23 21:53, 6F

01/23 21:53, 5年前 , 7F
mgur.com/dSfaF1t.jpg
01/23 21:53, 7F

01/23 21:53, 5年前 , 8F

01/23 21:54, 5年前 , 9F
像這樣的?
01/23 21:54, 9F

01/24 00:50, 5年前 , 10F
是n維陣列,可能甚至10層
01/24 00:50, 10F

01/24 00:51, 5年前 , 11F
順序是root>child1>child1.1>child1.1.1
01/24 00:51, 11F

01/24 00:52, 5年前 , 12F
遞迴不是問題,只是不知道怎麼組成array
01/24 00:52, 12F

01/24 00:57, 5年前 , 13F
本想看做到那一層,就去記key
01/24 00:57, 13F

01/24 00:57, 5年前 , 14F
,例如tree[root][child1][child1.1]
01/24 00:57, 14F

01/24 00:57, 5年前 , 15F
可是當不同分支不知道如何merge比較好
01/24 00:57, 15F

01/24 09:08, 5年前 , 16F
原來如此,我是會寫三維陣列啦,但是方法非常腦殘,我
01/24 09:08, 16F

01/24 09:08, 5年前 , 17F
之前寫三維是用三個while串聯,所以如果寫成10維之類
01/24 09:08, 17F

01/24 09:08, 5年前 , 18F
的應該會寫到手軟...這部分我是菜鳥,不知道有沒有大
01/24 09:08, 18F

01/24 09:08, 5年前 , 19F
大可以分享巨型陣列的寫法?
01/24 09:08, 19F

01/24 13:20, 5年前 , 20F
樓上,真的大大會跟你說不要寫出多維的陣列出來,這真的很
01/24 13:20, 20F

01/24 13:20, 5年前 , 21F
難維護
01/24 13:20, 21F

01/24 14:50, 5年前 , 22F
多維也沒有什麼要不要的 他都說前端需要了 那就是非
01/24 14:50, 22F

01/24 14:51, 5年前 , 23F
要產生一個 然後就交給前端去render 沒什麼維護不維護
01/24 14:51, 23F

01/24 15:09, 5年前 , 24F
你應該只需要跑兩次 第一次把所有紀錄組成$nodes陣列
01/24 15:09, 24F

01/24 15:10, 5年前 , 25F
以task_id為$nodes的索引
01/24 15:10, 25F

01/24 15:11, 5年前 , 26F
第二次先找出$root_id=$task_id那個node為root node
01/24 15:11, 26F

01/24 15:12, 5年前 , 27F
依照他children的內容找出$nodes裏面的項目接上去
01/24 15:12, 27F

01/24 15:18, 5年前 , 28F
遞迴往下 直到children內容為空為止
01/24 15:18, 28F

01/24 15:19, 5年前 , 29F
你可放心用 = 把下層節點複製到陣列裏面
01/24 15:19, 29F

01/26 14:18, 5年前 , 30F
難度還好,其實核心重點在於找出最多維數是多少或是添增為子
01/26 14:18, 30F

01/26 14:18, 5年前 , 31F
陣列的條件為何然後寫成可以被呼叫的function,剩下的就是在
01/26 14:18, 31F

01/26 14:18, 5年前 , 32F
function內判斷如果符合子陣列條件,我就在function內再呼叫
01/26 14:18, 32F

01/26 14:18, 5年前 , 33F
自己這個function一次。遞迴陣列就是用遞迴呼叫去解,維護上
01/26 14:18, 33F

01/26 14:18, 5年前 , 34F
也只需要維護function即可。
01/26 14:18, 34F

01/27 08:55, 5年前 , 35F
這跟寫BOM一樣丫...
01/27 08:55, 35F

02/06 02:51, 5年前 , 36F
如果問題是在前端,不見得要在 PHP 處理資料
02/06 02:51, 36F

02/18 14:24, 5年前 , 37F
我會頭跟內容分成兩個array交給前端處理
02/18 14:24, 37F
文章代碼(AID): #1SI5kFo0 (PHP)
文章代碼(AID): #1SI5kFo0 (PHP)