数组去重的几种方法
在 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;
}, []));注意事项
array_unique()默认保留第一个出现的键名,使用array_values()重置键名- 对于大数据量,
array_unique()性能可能较差,可考虑使用array_flip()技巧 - 对象数组去重建议使用
serialize方法或自定义比较逻辑
性能优化
对于超大数组,使用 array_flip() 技巧:
php
$arr = range(1, 100000);
$arr = array_merge($arr, range(1, 50000)); // 添加重复值
// 快速去重(仅适用于值为字符串或整数的数组)
$unique = array_keys(array_flip($arr));