比较两个多维数组,然后创建仅包含唯一值的数组。

8

我已经尝试了几个小时了,但还是没搞定。

我有两个多维数组。

    $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键值,但仍然无法正常工作。

我需要先合并它们吗?还是映射它们?啊,我真的不知道,我很迷茫。

任何帮助都将是非常棒的。

3个回答

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;


通过复制您的代码,然后将键名更改为我当前拥有的内容,当我打印 $tmpArray 时它返回一个空数组。 - Ryan
如果您在这段代码 http://pastebin.com/jJgDvLxE 中尝试,我得到的正是您想要的数组,那么显然您输入了错误的内容。 - Maxim Zubarev
我本来可能会这样做,但我刚刚重构了代码,这样对我来说更容易阅读。不管怎样,它能够正常工作,你刚刚帮我避免了把所有头发都拔光的危险。我过度思考了这个问题。 - Ryan

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中。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接