2013-04-21 114 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