如何从PHP中的多维数组中删除重复值

Ian*_*Ian 287 php arrays duplicate-data

如何从PHP中的多维数组中删除重复值?

示例数组:

Array
(
    [0] => Array
    (
        [0] => abc
        [1] => def
    )

    [1] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [2] => Array
    (
        [0] => mno
        [1] => pql
    )

    [3] => Array
    (
        [0] => abc
        [1] => def
    )

    [4] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [5] => Array
    (
        [0] => mno
        [1] => pql
    )

)
Run Code Online (Sandbox Code Playgroud)

小智 617

这是另一种方式.不保存任何中间变量.

我们使用它来删除各种重叠查询的结果.

$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
Run Code Online (Sandbox Code Playgroud)

  • 由于反序列化,数组越大越慢,数组越复杂.我使用array_intersect_key是有原因的(在此答案之前半年). (22认同)
  • @OIS刚刚测试了它,有一个错字但是它有效..感谢老兄!:$ no_duplicates = array_intersect_key($ array,array_unique(array_map('serialize',$ array))); (9认同)
  • 如果你想让索引连续,请使用array_values,即$ input = array_values(array_map("unserialize",array_unique(array_map("serialize",$ input)))); (3认同)
  • 现在你可能会选择json_encode和json_decode而不是PHP序列化.应该为所提供的值带来好处*和*您不会遇到序列化/反序列化的PHP序列化详细信息,并且很可能是不需要的. (3认同)
  • 请注意`serialize(array('a'=>'1','b'=>'1'))`与`serialize(array('b'=>'1','a'=>')不同1' ))`.对于用作`sets`或`(hash)maps`的数组,此选项将失败. (2认同)
  • @Michael - 来自当前的 PHP 文档:“请注意 **array_unique()** 不适用于多维数组。” (2认同)

Ja͢*_*͢ck 223

从5.2.9开始,array_unique()如果你使用这样的SORT_REGULAR标志就可以使用:

array_unique($array, SORT_REGULAR);
Run Code Online (Sandbox Code Playgroud)

这使得函数比较元素的相等性,就好像$a == $b正在使用一样,这非常适合您的情况.

产量

Array
(
    [0] => Array
        (
            [0] => abc
            [1] => def
        )

    [1] => Array
        (
            [0] => ghi
            [1] => jkl
        )

    [2] => Array
        (
            [0] => mno
            [1] => pql
        )

)
Run Code Online (Sandbox Code Playgroud)

但请记住,文档说明:

array_unique() 不适用于多维数组.

  • 奇怪的是,使用SORT_REGULAR标志对我来说不起作用,删除重复的数组. (4认同)
  • @Stefan你是对的; 它似乎没有给出正确的结果,但它可能是一个bug,因为它[适用于PHP 7](http://3v4l.org/qESFP)= / (4认同)
  • 这似乎也适用于我的情况,但是在array_unique()doc中这个注释是否还有其他人困扰?http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique-notes (4认同)
  • 我想这是比公认的解决方案更快速、更清晰的解决方案!让我们投票给这个!:) 嗯 [在 php 站点上](http://php.net/array_unique#98453) 我们可以看到它并没有像我想的那么快...... (2认同)
  • @Jack 你说得对,这是 PHP 5.6.23 的错误:https://eval.in/645675,但自 PHP 7.0.8 起已修复:https://eval.in/645676 (2认同)

小智 59

我有一个类似的问题,但我找到了100%的工作解决方案.

<?php
    function super_unique($array,$key)
    {
       $temp_array = [];
       foreach ($array as &$v) {
           if (!isset($temp_array[$v[$key]]))
           $temp_array[$v[$key]] =& $v;
       }
       $array = array_values($temp_array);
       return $array;

    }


$arr="";
$arr[0]['id']=0;
$arr[0]['titel']="ABC";
$arr[1]['id']=1;
$arr[1]['titel']="DEF";
$arr[2]['id']=2;
$arr[2]['titel']="ABC";
$arr[3]['id']=3;
$arr[3]['titel']="XYZ";

echo "<pre>";
print_r($arr);
echo "unique*********************<br/>";
print_r(super_unique($arr,'titel'));

?>
Run Code Online (Sandbox Code Playgroud)


OIS*_*OIS 29

其他方式.也将保留密钥.

function array_unique_multidimensional($input)
{
    $serialized = array_map('serialize', $input);
    $unique = array_unique($serialized);
    return array_intersect_key($input, $unique);
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*ten 20

用户对array_unique()文档的注释有很多解决方案.这是其中之一:

kenrbnsn at rbnsn dot com
27-Sep-2005 12:09

另一个用于多维数组的Array_Unique.我只在二维数组上测试过它,但它可能会被推广到更多,或者使用递归.

此函数使用serialize,array_unique和unserialize函数来完成工作.


function multi_unique($array) {
    foreach ($array as $k=>$na)
        $new[$k] = serialize($na);
    $uniq = array_unique($new);
    foreach($uniq as $k=>$ser)
        $new1[$k] = unserialize($ser);
    return ($new1);
}
Run Code Online (Sandbox Code Playgroud)

这是来自http://ca3.php.net/manual/en/function.array-unique.php#57202.


aut*_*tix 15

如果"删除重复项"意味着"删除重复项,但让其中一个",则解决方案可能是先array_unique(...)在"标识符列"上应用,然后在原始数组中删除已从列数组中删除的所有键:

$array = [
    [
        'id' => '123',
        'foo' => 'aaa',
        'bar' => 'bbb'
    ],
    [
        'id' => '123',
        'foo' => 'ccc',
        'bar' => 'ddd'
    ],
    [
        'id' => '567',
        'foo' => 'eee',
        'bar' => 'fff'
    ]
];

$ids = array_column($array, 'id');
$ids = array_unique($ids);
$array = array_filter($array, function ($key, $value) use ($ids) {
    return in_array($value, array_keys($ids));
}, ARRAY_FILTER_USE_BOTH);
Run Code Online (Sandbox Code Playgroud)

结果是:

Array
(
    [0] => Array
        (
            [id] => 123
            [foo] => aaa
            [bar] => bbb
        )

    [2] => Array
        (
            [id] => 567
            [foo] => eee
            [bar] => fff
        )

)
Run Code Online (Sandbox Code Playgroud)


Mah*_*ary 10

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => john
        )

    [1] => Array
        (
            [id] => 2
            [name] => smith
        )

    [2] => Array
        (
            [id] => 3
            [name] => john
        )

    [3] => Array
        (
            [id] => 4
            [name] => robert
        )

)

$temp = array_unique(array_column($array, 'name'));
$unique_arr = array_intersect_key($array, $temp);
Run Code Online (Sandbox Code Playgroud)

这将从数组中删除重复的名称.钥匙是唯一的

  • 确保 `$array` 的键从“0”开始。如果“$array”是先前数组操作的结果,则“$array”的键可能从另一个数字开始。使用 `array_values` 将键重置回“0” (2认同)
  • 这个答案在确定唯一性时不考虑两列。这是另一个问题的正确答案。 (2认同)
  • 按预期工作。谢谢。 (2认同)