2013-07-11 280 views
0

查看下面的代碼,當狀態,數字和日期在多個記錄中是相同的,我想合併記錄,並將不同版本號合併成一個元素,在一個組合數組元素中,希望下面的例子能夠更好地解釋我所追求的。多維關聯數組,結合PHP

我有一個艱難的時間提出一個乾淨和高效的方式來做到這一點。任何人都可以幫助我?我無法指出這個問題的類似問題。

可以說我有一個數組:

array (size=4) 
    995 => 
    array (size=4) 
     'status' => string 'accept' (length=6) 
     'number' => string '130106' (length=6) 
     'date' => string 'July 11th, 2013' (length=15) 
     'version_number' => 1 
    996 => 
    array (size=4) 
     'status' => string 'won' (length=3) 
     'number' => string '130106' (length=6) 
     'date' => string 'July 11th, 2013' (length=15) 
     'version_number' => null 
    993 => 
    array (size=4) 
     'status' => string 'won' (length=3) 
     'number' => string '130106' (length=6) 
     'date' => string 'July 11th, 2013' (length=15) 
     'version_number' => null 
    992 => 
    array (size=4) 
     'status' => string 'accept' (length=6) 
     'number' => string '130106' (length=6) 
     'date' => string 'July 11th, 2013' (length=15) 
     'version_number' => 3 

期望的結果:

array (size=3) 
     0 => 
     array (size=4) 
      'status' => string 'accept' (length=6) 
      'number' => string '130106' (length=6) 
      'date' => string 'July 11th, 2013' (length=15) 
      'version_number' => array (1, 3) 
     1 => 
     array (size=4) 
      'status' => string 'won' (length=3) 
      'number' => string '130106' (length=6) 
      'date' => string 'July 11th, 2013' (length=15) 
      'version_number' => null 
     2 => 
     array (size=4) 
      'status' => string 'won' (length=3) 
      'number' => string '130106' (length=6) 
      'date' => string 'July 11th, 2013' (length=15) 
      'version_number' => null 
+0

「我正在用一種乾淨而有效的方式來做到這一點,這是一個艱難的時刻。」這意味着你已經嘗試了一些東西。你能向我們展示你的嘗試嗎? – Jon

+0

本質上是數組複製的大雜燴,對於每一個,並手動建立新的數組。我只是覺得他們需要一些更好的方式來處理一些php數組排序功能。 –

回答

0

我想你可以使用下面的功能:通過您的陣列 http://www.php.net/manual/en/function.array-intersect-assoc.php

循環並檢查數組中每個索引的交集。如果狀態,數字和日期都相交,則合併版本並將其分配回檢查的索引,並彈出與之相比較的內容。一旦你完成對所有其他指數的檢查,然後把你當前的指數推到一個新的數組中。

我會放下一些僞代碼給你,因爲我沒有一臺服務器接入的時刻通過您的數組元素進行測試,只是循環和比較應該這樣工作:

array_intersect_assoc($array[995],$array[996]); -> intersect = number, date 
array_intersect_assoc($array[995],$array[993]); -> intersect = number, date 
array_intersect_assoc($array[995],$array[992]); -> intersect = status, number, date OK 

array_push($array[995]['version'], $array[992]['version']); 
unset($array[992]); 

end of loop, 
array_push($new_array, $array[995]); 

$new_array: 0 => 
       'status' => string 'accept' 
       'number' => string '130106' 
       'date' => string 'July 11th, 2013' 
       'version_number' => array (1, 3) 

#now loop moves on to the rest of the remaining elements. 

因此,它將通過你的循環將所有版本累積到一個索引中,將數組中的所有冗餘數據刪除(因此我們不會再循環它),然後在完整迭代時將索引保存到一個新的陣列。