Php 基于2个值从多维数组中删除重复项

Php 基于2个值从多维数组中删除重复项,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我有一个像这样的数组 $array = array( array("John","Smith","1"), array("Bob","Barker","2"), array("Will","Smith","2"), array("Will","Smith","4") ); $array = array( array("John","Smith","1"), array("Bob","Barker","2"), array("Will","Smith","2") );

我有一个像这样的数组

$array = array(
  array("John","Smith","1"),
  array("Bob","Barker","2"),
  array("Will","Smith","2"),
  array("Will","Smith","4")
);
$array = array(
  array("John","Smith","1"),
  array("Bob","Barker","2"),
  array("Will","Smith","2")
);
最后,我希望数组看起来像这样

$array = array(
  array("John","Smith","1"),
  array("Bob","Barker","2"),
  array("Will","Smith","2"),
  array("Will","Smith","4")
);
$array = array(
  array("John","Smith","1"),
  array("Bob","Barker","2"),
  array("Will","Smith","2")
);

带有SORT_REGULAR标志的数组_unique检查所有三个值。我已经看到了一些关于如何基于一个值删除重复项的解决方案,但我需要比较前两个值的唯一性。

带有注释的示例代码:

// array to store already existing values
$existsing = array();
// new array
$filtered = array();

foreach ($array as $item) {
    // Unique key
    $key = $item[0] . ' ' . $item[1];

    // if key doesn't exists - add it and add item to $filtered
    if (!isset($existsing[$key])) {
        $existsing[$key] = 1;
        $filtered[] = $item;
    }
}

使用
foreach
循环和
array\u值
函数的简单解决方案:

$arr = array(
          array("John","Smith","1"), array("Bob","Barker","2"), 
          array("Will","Smith","2"), array("Will","Smith","4")
);

$result = [];
foreach ($arr as $v) {
    $k = $v[0] . $v[1];  // considering first 2 values as a unique key
    if (!isset($result[$k])) $result[$k] = $v;
}

$result = array_values($result);
print_r($result);
输出:

Array
(
    [0] => Array
        (
            [0] => John
            [1] => Smith
            [2] => 1
        )

    [1] => Array
        (
            [0] => Bob
            [1] => Barker
            [2] => 2
        )

    [2] => Array
        (
            [0] => Will
            [1] => Smith
            [2] => 2
        )
)

为了好玩。这将保留最后一个事件并消除其他事件:

$array = array_combine(array_map(function($v) { return $v[0].$v[1]; }, $array), $array);
  • 映射数组并从子数组的第一个条目构建一个键
  • 将返回的数组用作新数组中的键,将原始数组用作值
如果要保留第一个引用,则只需在以下前后反转数组:

$array = array_reverse($array);
$array = array_reverse(array_combine(array_map(function($v) { return $v[0].$v[1]; },
                                               $array), $array));

因此,收集数组中的值并检查是否已经存在。循环并使用键构建数组作为两者的串联。两个答案保持
数组(“Will”、“Smith”、“2”)
,一个可以保持
数组(“Will”、“Smith”、“2”)
数组(“Will”、“Smith”、“4”)
因为您没有指定它是否重要。无需检查密钥是否存在。密钥将是唯一的。如果保留第一个键很重要,则反向循环。无需检查键是否存在。密钥将是唯一的。如果保留第一个循环很重要,那么反向循环。@Abracadver,我不这么认为。如果我省略一个键检查,最后一个值将是
数组(“will”,“Smith”,“4”)
,但是OP发布了一个精确的输出,其中最后一个值是
数组(“will”,“Smith”,“2”)
,是的,这就是为什么我说,如果保持第一个值很重要,那么在前后将
数组反向
。@Abracadver,我不能说
array\u reverse
方法很糟糕。但是
foreach
-
array\u values
方法的速度要快4倍多(在1000次迭代中测试,PHP5.6)@RomanPerekhrest是这样一个简单的解决方案。不能说我会自己想出你的版本,但现在我想知道为什么我没有想到合并两个值并将它们放入一个新数组,然后在每个循环上使用in_数组来检查是否存在重复。谢谢。OP能否获得
数组(“Will”、“Smith”、“2”)
作为此解决方案的最后一个值?@RomanPerekhrest是的,第二个示例是这样做的,因为他们没有指定。如果数据集较大,此代码的性能似乎较差。您可以对其进行基准测试。它也很难看。其他答案更好。