当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何从PHP中的多维数组中删除重复值》经验,为你挑选了7个好方法。

如何从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
    )

)

小智.. 617

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

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

$input = array_map("unserialize", array_unique(array_map("serialize", $input)));

由于反序列化,数组越大越慢,数组越复杂.我使用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认同)


Ja͢ck.. 223

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

array_unique($array, SORT_REGULAR);

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

产量

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

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

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

)

但请记住,文档说明:

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认同)


小智.. 59

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

";
print_r($arr);
echo "unique*********************
"; print_r(super_unique($arr,'titel')); ?>


OIS.. 29

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

function array_unique_multidimensional($input)
{
    $serialized = array_map('serialize', $input);
    $unique = array_unique($serialized);
    return array_intersect_key($input, $unique);
}


Jeremy Ruten.. 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);
}

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



1> 小智..:

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

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

$input = array_map("unserialize", array_unique(array_map("serialize", $input)));


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

2> Ja͢ck..:

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

array_unique($array, SORT_REGULAR);

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

产量

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

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

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

)

但请记住,文档说明:

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


奇怪的是,使用SORT_REGULAR标志对我来说不起作用,删除重复的数组.
@Stefan你是对的; 它似乎没有给出正确的结果,但它可能是一个bug,因为它[适用于PHP 7](http://3v4l.org/qESFP)= /
这似乎也适用于我的情况,但是在array_unique()doc中这个注释是否还有其他人困扰?http://php.net/manual/en/function.array-unique.php#refsect1-function.array-unique-notes

3> 小智..:

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

";
print_r($arr);
echo "unique*********************
"; print_r(super_unique($arr,'titel')); ?>



4> OIS..:

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

function array_unique_multidimensional($input)
{
    $serialized = array_map('serialize', $input);
    $unique = array_unique($serialized);
    return array_intersect_key($input, $unique);
}



5> Jeremy Ruten..:

用户对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);
}

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



6> automatix..:

如果"删除重复项"意味着"删除重复项,但让其中一个",则解决方案可能是先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);

结果是:

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

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

)



7> 小智..:
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);

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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有