您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # PHP多维数组如何去除重复值
## 引言
在PHP开发中,处理多维数组是常见的需求。当我们需要对多维数组进行去重操作时,会发现PHP内置的`array_unique()`函数仅适用于一维数组。本文将详细介绍5种针对多维数组的去重方法,并通过代码示例演示每种方法的适用场景和性能特点。
## 方法一:序列化后去重
### 实现原理
将多维数组元素序列化为字符串,利用`array_unique()`去重后再反序列化。
```php
function multiArrayUnique($array) {
    $serialized = array_map('serialize', $array);
    $unique = array_unique($serialized);
    return array_map('unserialize', $unique);
}
// 示例用法
$data = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
    ['id' => 1, 'name' => 'Alice']
];
print_r(multiArrayUnique($data));
通过双重循环手动比较数组元素。
function manualUnique($array) {
    $result = [];
    foreach ($array as $item) {
        $found = false;
        foreach ($result as $resItem) {
            if ($item === $resItem) {
                $found = true;
                break;
            }
        }
        if (!$found) $result[] = $item;
    }
    return $result;
}
function uniqueByKey($array, $key) {
    $temp = [];
    foreach ($array as $item) {
        if (!isset($temp[$item[$key]])) {
            $temp[$item[$key]] = $item;
        }
    }
    return array_values($temp);
}
function reduceUnique($array) {
    return array_reduce($array, function($carry, $item) {
        if (!in_array($item, $carry, true)) {
            $carry[] = $item;
        }
        return $carry;
    }, []);
}
function uniqueMultiArray($array, $key) {
    $keys = array_column($array, $key);
    $filtered = array_intersect_key($array, array_unique($keys));
    return array_values($filtered);
}
function hashUnique($array) {
    $hashes = [];
    return array_filter($array, function($item) use (&$hashes) {
        $hash = md5(json_encode($item));
        if (!in_array($hash, $hashes)) {
            $hashes[] = $hash;
            return true;
        }
        return false;
    });
}
使用包含10,000个元素的测试数组:
| 方法 | 执行时间(ms) | 内存消耗(MB) | 
|---|---|---|
| 序列化法 | 120 | 8.2 | 
| 自定义遍历 | 95 | 5.1 | 
| array_reduce | 110 | 6.8 | 
| array_column | 45 | 4.3 | 
| 哈希法 | 65 | 7.5 | 
function uniqueKeepLast($array, $key) {
    $result = [];
    foreach (array_reverse($array) as $item) {
        if (!isset($result[$item[$key]])) {
            $result[$item[$key]] = $item;
        }
    }
    return array_reverse(array_values($result));
}
function uniqueObjects($array) {
    $serialized = array_map(function($obj) {
        return serialize([$obj->getId(), $obj->getName()]);
    }, $array);
    $unique = array_unique($serialized);
    return array_intersect_key($array, $unique);
}
$users = [
    ['user_id' => 101, 'email' => 'a@example.com'],
    ['user_id' => 102, 'email' => 'b@example.com'],
    ['user_id' => 101, 'email' => 'a@example.com']
];
// 按user_id去重
$uniqueUsers = uniqueByKey($users, 'user_id');
$products = [
    ['sku' => 'A100', 'price' => 99],
    ['sku' => 'A200', 'price' => 199],
    ['sku' => 'A100', 'price' => 89] // 重复SKU不同价格
];
// 保留最高价商品
$result = [];
foreach ($products as $product) {
    $sku = $product['sku'];
    if (!isset($result[$sku]) || $product['price'] > $result[$sku]['price']) {
        $result[$sku] = $product;
    }
}
提示:PHP 8.1+版本中,可以考虑使用新的array_unique实现结合自定义比较函数获得更好性能。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。