2015-04-01 42 views
1

比方說,我有一個數組,看起來像這樣:合併相結合的陣列,如果某些鍵/值匹配的數組

Array 
(
    [0] => Array 
     (
      [id] => 44091 
      [epid] => 109912002 
      [makes] => Honda 
      [models] => Civic 
      [years] => 2000 
      [trims] => All 
      [engines] => 1.6L 1590CC 97Cu. In. l4 GAS SOHC Naturally Aspirated 
      [notes] => 
     ) 

    [1] => Array 
     (
      [id] => 77532 
      [epid] => 83253884 
      [makes] => Honda 
      [models] => Civic 
      [years] => 2000 
      [trims] => All 
      [engines] => 1.6L 1595CC l4 GAS DOHC Naturally Aspirated 
      [notes] => 
     ) 

    [2] => Array 
     (
      [id] => 151086 
      [epid] => 109956658 
      [makes] => Honda 
      [models] => Civic 
      [years] => 1999 
      [trims] => All 
      [engines] => 1.6L 1590CC 97Cu. In. l4 GAS SOHC Naturally Aspirated 
      [notes] => 
     ) 
) 

而且我想以某種方式合併/組/組合無論你怎麼稱呼它,如果具體鍵/值對匹配。

所以我的條件是:

如果讓&模型&年&修剪是一樣的,合併成1個陣列。其他鍵/值,如id/epid/trims/engines/notes不相關,如果可能的話,可以使用/繼承那些匹配條目中的1個。

一旦可能的話我想補充另一個條件也期待這個:

如果讓&模型&年&修剪&發動機是相同的組合爲1個陣列。

也許我很困惑自己,這兩個人都可以使用相同的代碼。

反正在這種情況下,我期望的結果看起來像這樣算賬:

Array 
(
    [0] => Array 
     (
      [id] => 44091 
      [epid] => 109912002 
      [makes] => Honda 
      [models] => Civic 
      [years] => 2000 
      [trims] => All 
      [engines] => 1.6L 1590CC 97Cu. In. l4 GAS SOHC Naturally Aspirated 
      [notes] => 
     ) 

    [1] => Array 
     (
      [id] => 151086 
      [epid] => 109956658 
      [makes] => Honda 
      [models] => Civic 
      [years] => 1999 
      [trims] => All 
      [engines] => 1.6L 1590CC 97Cu. In. l4 GAS SOHC Naturally Aspirated 
      [notes] => 
     ) 
) 

公告與1999年多年的排列並沒有合併。

我試圖搞亂array_unique,array_flip但無法讓它工作。

如果它很重要我使用PHP 5.6.7。

希望有人知道我在說什麼。

謝謝。

+0

這可能會幫助你http://stackoverflow.com/questions/22001121/php-filter-array-values-and-remove-duplicates-from-multi-dimensional-array – 2015-04-01 17:02:28

+0

這是個好僞代碼:'如果使模型&年份和修剪相同,則合併爲1個數組。其他鍵/值,如id/epid/trims/engines/notes不相關,如果可能的話,可以使用/繼承那些匹配條目中的1個。嘗試寫入PHP。爲了使事情更容易,從一個更小的陣列開始,比如三個車值或者其他東西。然後擴大規模以適應您的全部問題。 – Hektor 2015-04-01 17:03:56

+0

我個人會使用sha1將所需的項目散列在一起(或唯一),然後使用該散列作爲頂級密鑰。然後只是建立一個新的數組哈希他們和在PHP中的鍵的唯一性將照顧其餘的。 – ArtisticPhoenix 2015-04-01 17:07:41

回答

1

這可能是有益的

echo '<pre>'; 
foreach($name_of_your_array as $k=>$v){ 
    $sorted_array["$v[makes]$v[models]$v[years]$v[trims]"]=$v; 
} 
$sorted_array=array_values($sorted_array); 
print_r($sorted_array); 

輸出:

Array(
    [0] => Array 
     (
      [id] => 77532 
      [epid] => 83253884 
      [makes] => Honda 
      [models] => Civic 
      [years] => 2000 
      [trims] => All 
      [engines] => 1.6L 1595CC l4 GAS DOHC Naturally Aspirated 
      [notes] => 
     ) 

    [1] => Array 
     (
      [id] => 151086 
      [epid] => 109956658 
      [makes] => Honda 
      [models] => Civic 
      [years] => 1999 
      [trims] => All 
      [engines] => 1.6L 1590CC 97Cu. In. l4 GAS SOHC Naturally Aspirated 
      [notes] => 
     ) 

) 
+0

請注意,您可能有潛在的錯誤。如果你有一輛有'make'=>'Hon'和''model'=>'daCivic'的汽車。我承認,在這種情況下,這種情況不太可能發生,但你明白這一點,值得一提的是我相信。我可能至少將該鍵中的值與一個不太可能的字符串(比如'%|%'或別的東西)分開,只是爲了確保。 +1,因爲我相信這基本上是要走的路。 – Pevara 2015-04-01 22:08:20

+0

它會像'$ sorted_array [「$ v [makes] $ s $ v [models] $ s $ v [年] $ s $ v [修剪] $ s $ v [引擎]」] = $ v ;''而'$ s =「%|%」'? – dmotors 2015-04-02 00:30:25

+0

感謝answer @ user789456,它的方式相似但更優雅。 – dmotors 2015-04-02 00:38:48

0

使用作爲該鏈接陽光的建議:

php filter array values and remove duplicates from multi dimensional array

我能修改,因爲這是隻是針對單個鍵/值,它現在正在使用這個工作:

// Create dummy array for checking duplicates 
$taken = array(); 

// Loop through each item and if doesn't exist add to taken array. If exist then unset the key. 
foreach($comps as $key => $item) { 

    $string = $item['makes'] . $item['models'] . $item['years'] . $item['trims'] . $item['engines']; 

    if(!in_array($string, $taken)) { 

     $taken[] = $string; 

    } else { 

     unset($comps[$key]); 

    } 

} 

// Reindex the array 
$comps = array_values($comps);