PHP array_unique() 函数(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
PHP array_unique() 函数基础用法
在编程过程中,处理数组时最常见的需求之一就是“去重”——即去除数组中重复的元素,保留唯一值。PHP 内置的 array_unique()
函数正是为此设计的实用工具。它如同一位细心的“清洁工”,能够高效地扫描数组,将重复的元素“清理”掉,仅保留首次出现的值。对于编程初学者而言,掌握这一函数不仅能提升代码效率,还能减少手动处理重复值的繁琐步骤。
基本语法与参数说明
array_unique()
函数的语法简洁明了:
array_unique(array $array, int $sort_flags = SORT_STRING): array
参数说明如下:
参数 | 类型 | 是否必选 | 说明 |
---|---|---|---|
$array | array | 是 | 需要处理的原始数组。 |
$sort_flags | int | 否 | 控制比较方式的标志,可选值包括 SORT_STRING (默认)、SORT_NATURAL 等。 |
参数解析:
$array
是必须传入的原始数组。函数会遍历该数组,识别并删除重复元素。$sort_flags
是可选参数,默认使用SORT_STRING
进行字符串比较。若设置为SORT_NATURAL
,则会以自然排序方式比较值(例如,"2" 会被视为比 "10" 小)。
示例代码:基础去重
$fruits = ["apple", "banana", "apple", "orange", "banana"];
$unique_fruits = array_unique($fruits);
print_r($unique_fruits);
输出结果:
Array
(
[0] => apple
[1] => banana
[3] => orange
)
关键点解析
-
保留首次出现的值
函数会保留数组中首次出现的元素,后续重复的元素会被删除。例如,在示例中,第二个“apple”会被移除,但第一个“apple”会被保留。 -
仅对值进行比较
array_unique()
仅比较元素的值,而不考虑键名。若数组元素是对象或资源,此函数可能无法正常工作。 -
默认使用字符串比较
默认的SORT_STRING
标志会将所有值视为字符串进行比较。因此,数字0
与字符串"0"
会被视为相同值并被去重。
进阶用法与常见场景
场景一:处理多维数组的局限性
array_unique()
的默认行为仅能处理一维数组。若需要去重多维数组的特定字段(例如商品列表中的重复商品 ID),需结合其他函数实现。
示例:多维数组的去重
$products = [
["id" => 1, "name" => "iPhone"],
["id" => 2, "name" => "iPad"],
["id" => 1, "name" => "iPhone Pro"],
];
// 提取 ID 列表并去重
$unique_ids = array_unique(array_column($products, "id"));
// 输出:[1, 2]
print_r($unique_ids);
技巧:
通过 array_column()
提取目标字段,再使用 array_unique()
,可实现对多维数组特定键值的去重。
场景二:结合自定义回调函数
当需要更复杂的去重逻辑(例如同时比较多个字段),可以使用 array_filter()
和自定义回调函数替代 array_unique()
。
示例:同时去重商品名称和价格
$products = [
["name" => "Laptop", "price" => 1000],
["name" => "Laptop", "price" => 1000],
["name" => "Monitor", "price" => 500],
];
// 自定义去重逻辑
$filtered_products = array_values(array_filter(
$products,
function ($item) use (&$seen) {
$key = $item['name'] . $item['price'];
if (isset($seen[$key])) {
return false;
}
$seen[$key] = true;
return true;
},
ARRAY_FILTER_USE_BOTH
));
print_r($filtered_products);
输出结果:
Array
(
[0] => Array
(
[name] => Laptop
[price] => 1000
)
[1] => Array
(
[name] => Monitor
[price] => 500
)
)
注意事项与常见问题
问题一:多维数组的键名保留问题
array_unique()
会保留元素的原始键名,但无法直接处理多维数组的嵌套结构。例如:
$array = [
["id" => 1],
["id" => 1],
];
$unique_array = array_unique($array); // 会保留两个元素,因为键名不同
解决方法:
使用 array_map('serialize', $array)
将子数组序列化为字符串,再进行去重:
$serialized = array_map('serialize', $array);
$unique_serialized = array_unique($serialized);
$unique_array = array_map('unserialize', $unique_serialized);
问题二:浮点数与字符串的比较差异
由于 array_unique()
默认使用字符串比较,浮点数与字符串可能被误判为重复。例如:
$values = [0, "0", 0.0];
$unique_values = array_unique($values);
// 输出:[0]
解决方法:
若需精确比较数值类型,可使用 SORT_NUMERIC
标志:
$unique_values = array_unique($values, SORT_NUMERIC);
// 输出:[0, 0.0]
实际案例分析:电商场景的去重应用
案例一:清理用户提交的重复商品 ID
假设用户在购物车中误添加了重复的商品,可通过 array_unique()
清理:
$cart = [101, 102, 101, 103, 102];
$clean_cart = array_unique($cart);
// 输出:[101, 102, 103]
案例二:合并多个来源的用户列表
当从不同接口获取用户数据时,可能包含重复的用户 ID:
$users1 = [["id" => 1], ["id" => 2]];
$users2 = [["id" => 2], ["id" => 3]];
$all_users = array_merge($users1, $users2);
// 提取 ID 并去重
$unique_ids = array_unique(array_column($all_users, "id"));
// 输出:[1, 2, 3]
性能优化与替代方案
方案一:使用 array_filter 实现轻量级去重
对于小规模数组,可结合 array_filter()
与自定义变量实现更灵活的去重:
$array = [1, 2, 3, 2, 4, 3];
$seen = [];
$filtered = array_filter(
$array,
function ($item) use (&$seen) {
if (in_array($item, $seen)) {
return false;
}
$seen[] = $item;
return true;
}
);
方案二:结合 SORT_NATURAL 处理自然排序
当处理包含数字的字符串(如版本号)时,SORT_NATURAL
可提升准确性:
$versions = ["v2", "v10", "v1"];
$sorted = array_unique($versions, SORT_NATURAL);
// 输出:["v2", "v10", "v1"]
结论
PHP 的 array_unique()
函数是处理数组重复元素的高效工具。通过理解其参数、应用场景及潜在限制,开发者可以灵活应对从基础去重到复杂多维数组的挑战。无论是清理用户输入、合并数据源,还是优化电商库存管理,这一函数都能显著提升代码的简洁性和效率。建议读者在实践中结合实际需求,探索 array_unique()
与其他函数(如 array_map()
、array_filter()
)的组合使用,以实现更强大的数据处理能力。