您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。