在PHP开发的实际场景中,数据去重是高频需求,比如处理接口返回的用户列表、清洗数据库查询的冗余结果、整理表单提交的重复选项等,都需要通过合理的去重逻辑保证数据的唯一性。不同的数据结构和使用场景对应不同的去重方案,开发者可以根据实际需求选择合适的方法。

一、使用内置函数array_unique去重
array_unique是PHP官方提供的数组去重函数,能够直接对一维数组进行去重处理,它会保留数组中第一个出现的元素,移除后续重复的元素,函数返回去重后的新数组。
该方法适合处理值类型简单的一维数组,比如字符串数组、数字数组,使用方式非常简便:
<?php // 定义包含重复元素的普通数组 $original_arr = [1, 2, 2, 3, 4, 4, 5, 'a', 'a', 'b']; // 使用array_unique去重 $unique_arr = array_unique($original_arr); // 输出去重结果 print_r($unique_arr); ?>
上述代码的输出结果为Array ( [0] => 1 [1] => 2 [3] => 3 [4] => 4 [6] => 5 [7] => a [9] => b ),可以看到重复的元素都被移除了。需要注意的是,array_unique在处理数组时会保留原数组的键名,如果需要重置键名,可以配合array_values函数使用。
二、使用array_filter配合自定义逻辑去重
如果去重的需求不是简单的相同值去重,而是需要根据特定规则判断重复,比如忽略大小写去重、按照元素的某部分内容去重,就可以使用array_filter结合自定义回调函数实现。
下面是实现忽略大小写去重的示例:
<?php
// 定义包含大小写不同的重复字符串数组
$str_arr = ['Apple', 'apple', 'Banana', 'BANANA', 'Cherry'];
// 用于存储已经出现过的元素(转为小写后)
$exist_map = [];
// 使用array_filter过滤重复元素
$result = array_filter($str_arr, function($item) use (&$exist_map) {
// 将元素转为小写作为判断依据
$lower_item = strtolower($item);
// 如果已经存在则过滤掉
if (isset($exist_map[$lower_item])) {
return false;
}
// 不存在则记录到映射表并返回保留
$exist_map[$lower_item] = true;
return true;
});
// 重置键名
$result = array_values($result);
print_r($result);
?>
上述代码会输出Array ( [0] => Apple [1] => Banana [2] => Cherry ),成功实现了忽略大小写的去重效果。
三、多维数组去重处理
array_unique无法直接处理多维数组,针对多维数组的去重需要自定义逻辑,通常的思路是先遍历多维数组,提取用于判断重复的唯一标识,再根据标识过滤重复元素。
以下是针对二维数组按照指定键去重的示例,比如按照用户ID去重用户列表:
<?php
// 定义二维用户数组,包含重复的用户ID
$user_list = [
['id' => 1, 'name' => '张三', 'age' => 20],
['id' => 2, 'name' => '李四', 'age' => 22],
['id' => 1, 'name' => '张三', 'age' => 20],
['id' => 3, 'name' => '王五', 'age' => 25],
['id' => 2, 'name' => '李四', 'age' => 22]
];
// 用于存储已出现的用户ID
$exist_ids = [];
// 存储去重后的结果
$unique_user_list = [];
// 遍历用户数组
foreach ($user_list as $user) {
// 如果用户ID未出现过则保留
if (!isset($exist_ids[$user['id']])) {
$exist_ids[$user['id']] = true;
$unique_user_list[] = $user;
}
}
print_r($unique_user_list);
?>
上述代码会输出仅包含3个不重复用户数据的数组,实现了二维数组按指定键去重的需求。如果需要根据多个键判断重复,只需要调整判断逻辑,组合多个键的值作为唯一标识即可。
四、数据库查询层面的去重
除了在PHP代码层处理数组去重,如果是从数据库获取的数据,优先建议在SQL查询阶段就完成去重,这样能减少数据传输量,提升整体性能。常用的SQL去重方式是使用DISTINCT关键字或者GROUP BY子句。
以下是使用DISTINCT查询不重复用户名的示例:
<?php // 假设已经建立了数据库连接$pdo // 使用DISTINCT查询不重复的用户名 $sql = "SELECT DISTINCT username FROM user_table"; $stmt = $pdo->prepare($sql); $stmt->execute(); $unique_usernames = $stmt->fetchAll(PDO::FETCH_COLUMN); print_r($unique_usernames); ?>
这种方式在数据量大的时候比先查询所有数据再到PHP层去重效率更高,是推荐的首选方案。
五、去重注意事项
- array_unique函数对数组元素进行比较时使用的是宽松比较,比如数字1和字符串'1'会被判定为重复,如果需要严格比较,需要自定义去重逻辑。
- 去重后如果需要连续的索引,一定要使用
array_values函数重置键名,避免后续遍历或者取值出现问题。 - 处理大数组去重时,自定义去重逻辑中使用哈希表(PHP的关联数组)存储已出现元素的方式,时间复杂度是O(n),比多次使用in_array判断的O(n²)效率高很多。
- 如果是处理对象数组去重,需要根据对象的唯一属性(比如对象的ID属性)来判断重复,不能直接对对象使用array_unique。
PHP数据去重array_uniquearray_filter自定义去重修改时间:2026-06-30 22:30:46