如何仅保留其余唯一键/值,而删除数组中所有复制的值? array_unique
不是解决方案。
例如,我有以下数组。
Array
(
[169580] => 1901
[209662] => 2245
[209682] => 1901
)
我想比较数组中的所有值,并同时删除[169580] => 1901
和[209682] => 1901
并将[209662] => 2245
保留在数组中。 “键”是我无法搜索的未知值。
最终结果将如下所示:
Array
(
[209662] => 2245
)
答案 0 :(得分:2)
一种可能性是按值分组,然后通过从只有一个键的组中获取键/值对来创建结果。
// group
foreach ($array as $key => $value) {
$values[$value][] = $key;
}
// filter
foreach ($values as $value => $keys) {
if (count($keys) == 1) $result[$keys[0]] = $value;
}
使用数组函数(类似于其他答案所示)而不是循环的这种算法的近似等价物是这样的:
// group
$counts = array_count_values($array);
// filter
$result = array_filter($array, function($value) use ($counts) {
return $counts[$value] == 1;
});
答案 1 :(得分:2)
您可以使用几个array_
函数来完成此操作:array_count_values()
创建一个频率计数查找表,array_filter
在原始数组上使用count !== 1
删除键。
$arr = [
"169580" => 1901,
"209662" => 2245,
"209682" => 1901
];
$lookup = array_count_values($arr);
print_r(array_filter($arr, function ($e) use ($lookup) {
return $lookup[$e] == 1;
}));
输出:
Array
(
[209662] => 2245
)