删除数组中所有复制的值,仅保留唯一的键/值对

时间:2018-10-31 22:07:57

标签: php arrays

如何仅保留其余唯一键/值,而删除数组中所有复制的值? array_unique不是解决方案。

例如,我有以下数组。

Array
(
    [169580] => 1901
    [209662] => 2245
    [209682] => 1901
)

我想比较数组中的所有值,并同时删除[169580] => 1901[209682] => 1901并将[209662] => 2245保留在数组中。 “键”是我无法搜索的未知值。

最终结果将如下所示:

Array
(
    [209662] => 2245
)

2 个答案:

答案 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
)

Try it!