PHP array_unique() 函数(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 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

参数说明如下:

参数类型是否必选说明
$arrayarray需要处理的原始数组。
$sort_flagsint控制比较方式的标志,可选值包括 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
)

关键点解析

  1. 保留首次出现的值
    函数会保留数组中首次出现的元素,后续重复的元素会被删除。例如,在示例中,第二个“apple”会被移除,但第一个“apple”会被保留。

  2. 仅对值进行比较
    array_unique() 仅比较元素的值,而不考虑键名。若数组元素是对象或资源,此函数可能无法正常工作。

  3. 默认使用字符串比较
    默认的 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())的组合使用,以实现更强大的数据处理能力。

最新发布