[請益] 請教php多層陣列比對並更新

看板PHP作者 (OD)時間11年前 (2014/04/07 16:04), 11年前編輯推噓5(5024)
留言29則, 3人參與, 最新討論串1/1
各位大大好~ 小弟不才,最近接到一個任務,就是寫出二維以上之兩陣列比對的class或function, 而兩陣列的各有指定key=>value值,假如一個陣列是現有的陣列資料, 另一陣列來自json_decode產生出的陣列。 --------------------------------------------------------------------------- 程式需求敘述: 需求是要以"現有陣列資料"為主, 第一、若唯一識別值存在於"現有陣列資料"中, 且該筆相對應的陣列資料於"json_decode陣列"中有更新值, 則進行"現有陣列資料"更新" (※僅限於"現有陣列資料"原有的key相對應的value值做更新, 而"json_decode陣列"多餘的key=>value值則忽略); 第二、若唯一識別值不存在於"現有陣列資料"中, 則新增該筆"唯一識別值陣列"到"現有陣列資料"中。 目標:在最終回傳一個需要更新的完整陣列 如下所示: ---------------------------現有的陣列資料-------------------------- Array ( [330] => Array ( [id] => 330 [state] => 0 [date] => 2014-01-08 [time] => Array ( [time1] => 1400 [time2] => 1500 [time3] => 1600 ) ) [331] => Array ( [id] => 331 [state] => 1 [date] => 2014-01-08 [time] => Array ( [time1] => 0800 [time2] => 0830 [time3] => 0840 ) ) ) ------------------------------------------------------------------- ------------------------來自json_decode陣列------------------------ Array ( [330] => Array ( [id] => 330 [state] => 2 [date] => 2014-01-08 [time] => Array ( [time1] => 1400 [time2] => 1430 [time3] => 1500 ) [creater] => 8951 ) [333] => Array ( [id] => 333 [state] => 1 [date] => 2014-01-08 [time] => Array ( [time1] => 1600 [time2] => 1630 [time3] => 1700 ) ) ) ------------------------------------------------------------------- --------------------------最終目標產生陣列------------------------- Array ( [330] => Array ( [id] => 330 [state] => 2 [date] => 2014-01-08 [time] => Array ( [time1] => 1400 [time2] => 1430 [time3] => 1500 ) ) [333] => Array ( [id] => 333 [state] => 1 [date] => 2014-01-08 [time] => Array ( [time1] => 1600 [time2] => 1630 [time3] => 1700 ) ) ) ------------------------------------------------------------------- 紅色字體為json_decode陣列資料中有該key=>value,但現有陣列資料沒有 綠色字體為欲更新的部分。 ------------------------------------------------------------------- 請問各位大大們有什麼建議的方法嗎? 小弟目前是想以遞歸方式來做, 但遇到若有更多層陣列的話,不知道該如何指定到正確的陣列位址來進行資料更新, 請各位大大不吝給予小弟賜教,謝謝~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.109.6.65 ※ 文章網址: http://www.ptt.cc/bbs/PHP/M.1396857871.A.47F.html ※ 編輯: NdhuOD (140.109.6.65), 04/07/2014 16:15:05

04/07 16:51, , 1F
遞歸? 什麼意思? 這應該用個 foreach loop 就行了
04/07 16:51, 1F

04/07 16:52, , 2F
另外 更多層陣列的層數有沒有規則可循? 若沒有的話雖然也可
04/07 16:52, 2F

04/07 16:53, , 3F
以處理 就看程式技巧了 php處理這種東西正合適
04/07 16:53, 3F

04/07 17:30, , 4F
是遞迴才對~上面筆誤~bobju大大說的foreach loop我有用到,
04/07 17:30, 4F

04/07 17:31, , 5F
但又考慮要對應到key值,就比較難處理,想開發不僅只適用
04/07 17:31, 5F

04/07 17:32, , 6F
2~3層的陣列,希望能夠是一體適用,多層都可以利用此class
04/07 17:32, 6F

04/07 17:32, , 7F
還請大大指點迷津,謝謝您~
04/07 17:32, 7F

04/07 17:38, , 8F
一般是可以用[reference]的機制來為樹當中的節點做定位
04/07 17:38, 8F

04/07 17:39, , 9F
若能先定義出具體資料結構, 用它來解析會比較容易解說
04/07 17:39, 9F

04/07 17:40, , 10F
這篇文章當中的範例就只能是個 [key=>array] 的 node list,
04/07 17:40, 10F

04/07 17:41, , 11F
看不出你會如何用它來描述樹狀結構
04/07 17:41, 11F

04/07 17:56, , 12F
小弟希望是能夠使用樹狀結構,以每筆資料的PK作為根節點,
04/07 17:56, 12F

04/07 17:57, , 13F
但是不知道該如何使用tree的reference方式,小弟用笨方法,
04/07 17:57, 13F

04/07 17:58, , 14F
每進一層就用key=>value方式來取索引和值,但第二層之後就
04/07 17:58, 14F

04/07 17:59, , 15F
不知道如何找到reference的根節點,只知道目前的key=>value
04/07 17:59, 15F

04/07 17:59, , 16F
330、331、333那些表示的就是PK,也就是小弟想拿來做根節點
04/07 17:59, 16F

04/07 18:00, , 17F
請大大指導小弟>"<,感謝您~
04/07 18:00, 17F

04/07 18:02, , 18F
假設 node 用 $node 表示, &$node 就是其reference
04/07 18:02, 18F

04/07 18:03, , 19F
你可以在做 recursive traversal 時, 把每組 $key => $node
04/07 18:03, 19F

04/07 18:05, , 20F
的關係改為 $key => &$node_ref, 而 $node_ref 則複製到另
04/07 18:05, 20F

04/07 18:05, , 21F
一個全域範圍的 array 裏, 其內容即為$node的內容
04/07 18:05, 21F

04/07 18:06, , 22F
好像很複雜 @_@
04/07 18:06, 22F

04/07 18:09, , 23F
總之 一定能處理就對了 技巧也不限於此 或許你玩一玩就玩出
04/07 18:09, 23F

04/07 18:09, , 24F
心得來了
04/07 18:09, 24F

04/07 18:09, , 25F
謝謝大大~讓小弟思考一下,不懂的地方再請教您~謝謝>"<
04/07 18:09, 25F

04/07 18:12, , 26F
其實也可以考慮先定義出一組需要的key 之後foreach去一
04/07 18:12, 26F

04/07 18:12, , 27F
組你要的格式資料
04/07 18:12, 27F

04/07 18:14, , 28F
是我的話,就從你給我的資料中拿出我要的資料,再組成
04/07 18:14, 28F

04/07 18:14, , 29F
我想要的樣子。這樣可以不用去判斷是否有更新。
04/07 18:14, 29F
文章代碼(AID): #1JGbmFH_ (PHP)
文章代碼(AID): #1JGbmFH_ (PHP)