Skip to content

数组去重的几种方法

在 PHP 开发中,数组去重是一个常见需求。本文介绍几种常用的数组去重方法及其适用场景。

使用 array_unique() 函数

最基础的去重方法,适用于一维数组:

php
$arr = [1, 2, 2, 3, 4, 4, 5];
$unique = array_unique($arr);
print_r($unique); // [1, 2, 3, 4, 5]

对二维数组去重

array_unique() 无法直接处理二维数组,需要自定义方法:

php
$users = [
    ['id' => 1, 'name' => '张三'],
    ['id' => 2, 'name' => '李四'],
    ['id' => 1, 'name' => '张三'], // 重复
];

// 方法1:根据指定键去重
function uniqueByKey($array, $key) {
    $result = [];
    $keys = [];
    foreach ($array as $item) {
        if (!in_array($item[$key], $keys)) {
            $keys[] = $item[$key];
            $result[] = $item;
        }
    }
    return $result;
}

$unique = uniqueByKey($users, 'id');

// 方法2:使用序列化(更精确)
$unique = array_map('unserialize', array_unique(array_map('serialize', $users)));

保留最新/最旧的重复项

php
// 保留最新(反转数组后去重)
$arr = [1, 2, 2, 3, 3];
$unique = array_reverse(array_unique(array_reverse($arr)));
// 结果:[1, 2, 3] - 保留了后面的2和3

// 或者使用 array_reduce
$unique = array_values(array_reduce($arr, function($carry, $item) {
    $carry[$item] = $item;
    return $carry;
}, []));

注意事项

  1. array_unique() 默认保留第一个出现的键名,使用 array_values() 重置键名
  2. 对于大数据量,array_unique() 性能可能较差,可考虑使用 array_flip() 技巧
  3. 对象数组去重建议使用 serialize 方法或自定义比较逻辑

性能优化

对于超大数组,使用 array_flip() 技巧:

php
$arr = range(1, 100000);
$arr = array_merge($arr, range(1, 50000)); // 添加重复值

// 快速去重(仅适用于值为字符串或整数的数组)
$unique = array_keys(array_flip($arr));

Binstork