如何从多维数组中删除所有重复元素,包括原始元素?
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);
实施 中的建议,为了获得最佳时间复杂度,请保留以前遇到的值及其索引的查找数组。当多次遇到一个值时,从输入数组中删除当前行和原始行。在已经 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',
),
)
我正在使用 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);
实施 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',
),
)