如何从多维数组中删除所有重复元素,包括原始元素?

How to remove from a multidimensional array all duplicate elements including the original?

我正在使用 php 7.1.

我已经看到要消除重复元素就足够了

array_unique($array, SORT_REGULAR);

我也看过这部作品

array_map("unserialize", array_unique(array_map("serialize", $array)));

但这只会删除从数组中复制的元素,我想删除那些重复的元素,但我不希望它只留下 1 个没有重复的元素,我希望它也删除原始元素它所基于的验证它是否重复

我该怎么做?

例如我有这个

$array = array(
    [0] = array(
        [id] => 1,
        [number] => 12345,
        [date] => 2022-05-09
    )
    [1] = array(
        [id] => 2,
        [number] => 123456,
        [date] => 2022-05-09
    )
    [2] = array(
        [id] => 3,
        [number] => 123456,
        [date] => 2022-05-09
    )
    [3] = array(
        [id] => 3,
        [number] => 123456,
        [date] => 2022-05-09
    )
)

怎么让它变成这样:?

    $array = array(
        [0] = array(
            [id] => 1,
            [number] => 12345,
            [date] => 2022-05-09
        )
        [1] = array(
            [id] => 2,
            [number] => 123456,
            [date] => 2022-05-09
        )
)

这应该很简单。使用 array_column and use array_count_values to get counts of occurrences of each ID. Then, use array_filter 提取所有 ID 以仅过滤唯一的 ID。

<?php

$unique_ids = array_count_values(array_column($array,'id'));
$res = array_filter($array, fn($v) => $unique_ids[$v['id']] === 1);
print_r($res);

Online Demo

实施 中的建议,为了获得最佳时间复杂度,请保留以前遇到的值及其索引的查找数组。当多次遇到一个值时,从输入数组中删除当前行和原始行。在已经 unset() 的元素上调用 unset() 是绝对安全的,不会发生破坏。

我已经扩展了您的输入数组以证明 unset() 不会造成麻烦。我在 foreach() 中使用“数组解构”来使代码更简洁。

代码:(Demo)

$array = [
    ['id' => 1, 'number' => 12345, 'date' => '2022-05-09'],
    ['id' => 2, 'number' => 123456, 'date' => '2022-05-09'],
    ['id' => 3, 'number' => 123456, 'date' => '2022-05-09'],
    ['id' => 3, 'number' => 123456, 'date' => '2022-05-09'],
    ['id' => 4, 'number' => 123457, 'date' => '2022-05-10'],
    ['id' => 4, 'number' => 123458, 'date' => '2022-05-11'],
    ['id' => 3, 'number' => 123459, 'date' => '2022-05-12']
];

$found = [];
foreach ($array as $index => ['id' => $id]) {
    if (isset($found[$id])) {
        unset($array[$index], $array[$found[$id]]);
    } else {
        $found[$id] = $index;
    }
}
var_export($array);

输出:

array (
  0 => 
  array (
    'id' => 1,
    'number' => 12345,
    'date' => '2022-05-09',
  ),
  1 => 
  array (
    'id' => 2,
    'number' => 123456,
    'date' => '2022-05-09',
  ),
)