2013-04-21 26 views
7

我一直試圖讓現在幾個小時。比較兩個多維數組,然後創建唯一的數組

我有兩個多維數組

$newData (
    [0] => Array(
     [id] => 1 
     [name] => John 
     [sex] => male 
    ) 
    [1] => Array(
     [id] => 2 
     [name] => Kenny 
     [sex] => male 
    ) 
    [2] => Array(
     [id] => 3 
     [name] => Sarah 
     [sex] => female 
    ) 
    [3] => Array(
     [id] => 4 
     [name] => George 
     [sex] => male 
    ) 
) 

$oldData (
    [0] => Array(
     [id] => 3 
     [name] => Sarah 
     [sex] => female 
    ) 
    [1] => Array(
     [id] => 4 
     [name] => George 
     [sex] => male 
    ) 
    [2] => Array(
     [id] => 5 
     [name] => Peter 
     [sex] => male 
    ) 
    [3] => Array(
     [id] => 6 
     [name] => Lexi 
     [sex] => female 
    ) 
) 

我需要比較$ newData和$ OLDDATA搶只有新的數據是第一公共陣列之前。然後

我的$ newData將是:

$newData (
[0] => Array(
    [id] => 1 
    [name] => John 
    [sex] => male 
) 
[1] => Array(
    [id] => 2 
    [name] => Kenny 
    [sex] => male 
) 

我用盡了一切從array_unique,如果比較ID鑰匙,但沒有正常工作。

我需要先合併它們嗎?映射它們?巴赫,我不知道,我很迷茫。

任何幫助將是真棒

回答

7

我只想做一個嵌套的foreach循環。我不知道你使用的編程語言,但假設它的PHP($):

$tmpArray = array(); 

foreach($newData as $data1) { 

    $duplicate = false; 
    foreach($oldData as $data2) { 
    if($data1['id'] === $data2['id'] && $data1['name'] === $data2['name'] && $data1['sex'] === $data2['sex']) $duplicate = true; 
    } 

    if($duplicate === false) $tmpArray[] = $data1; 
} 

你就必須在$tmpArray變量所需的陣列。事後您可以製作$newData = $tmpArray;

+0

複製你的代碼,然後改變鍵名什麼,我現在有,它返回一個空數組時,我的print_r $ tmpArray – Ryan 2013-04-21 20:10:22

+0

隨着小操作,這個工程。謝謝。 – Ryan 2013-04-21 20:20:51

+0

那麼你顯然錯誤的東西。如果我在這裏嘗試這段代碼http://pastebin.com/jJgDvLxE我得到了你想要的數組,因此... – 2013-04-21 20:21:06

1

只要遍歷$newData,直到找到來自$oldData的第一個元素?

$cmp = $oldData[0]; 
$data = array(); 
foreach ($newData as $el) { 
    if ($el['id'] === $cmp['id'] 
     && $el['name'] === $cmp['name'] 
     && $el['sex'] === $cmp['sex']) 
     break; 
    $data[] = $el; 
} 

您的新數據將存儲在$data中。

+1

避免使用兩個循環的好方法 – 2013-04-21 20:26:19

0

如何使用它?通過修改thelamborghinistory's答案,

如果存在重複,請取消設置動態密鑰。

public function removeDuplicate($oldData, $newData, $key) 
{ 
    $tmpArray = array(); 
    foreach ($newData as $data1) { 
     $duplicate = false; 
     foreach ($oldData as $data2k => $data2v) { 
      if ($data1[$key] === $data2v[$key]) { 
       unset($newData[$data2k]); 
       $duplicate = true; 
      } 
     } 
     if ($duplicate === true) { 
      $tmpArray[] = $data1; 
     } else { 
      $tmpArray[] = $data1; 
     } 
    } 
    return $tmpArray; 
} 

然後你只是調用,

removeDuplicate($oldData, $newData, 'name');//or whatever you want