You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对含关联数组的PHP多维数组按指定键去重?

按指定键对多维数组去重的解决方案

嘿,我懂你的痛点——你想基于product_code这个键对多维数组去重,而且去重后要保留特定的条目(比如prod3留qty=1的那条,prod4留重复的那条)。之前用的serialize+array_unique方法没达到预期,其实是因为这个方法会把整个子数组当成判断重复的依据,而你要的是只看product_code对吧?

为什么原来的方法行不通?

咱们拆解下你之前的代码:

$cart = array_map("unserialize", array_unique(array_map("serialize", $cart)));

array_map("serialize", $cart)会把每个子数组转成唯一的字符串,比如:

  • 第一个prod3条目转成:a:2:{s:12:"product_code";s:5:"prod3";s:3:"qty";i:7;}
  • 第二个prod3条目转成:a:2:{s:12:"product_code";s:5:"prod3";s:3:"qty";i:1;}

这两个字符串完全不同,所以array_unique根本不会把它们当成重复项,自然去重失败啦。

符合你需求的解决方案

我们可以用循环+临时数组的方式,直接基于product_code来分组,后面的同code条目会覆盖前面的,刚好匹配你想要的结果:

代码实现(保留原数组键)

// 你的原数组
$cart = [
    ['product_code' => 'prod3', 'qty' => 7],
    ['product_code' => 'prod3', 'qty' => 1],
    ['product_code' => 'prod4', 'qty' => 7],
    ['product_code' => 'prod4', 'qty' => 7],
];

$temp = [];
// 先按product_code分组,记录原键和条目
foreach ($cart as $key => $item) {
    $temp[$item['product_code']] = ['original_key' => $key, 'data' => $item];
}

// 整理成你要的结果数组(保留原键)
$result = [];
foreach ($temp as $val) {
    $result[$val['original_key']] = $val['data'];
}

print_r($result);

运行后会得到你期望的输出:

Array ( [1] => Array ( [product_code] => prod3 [qty] => 1 ) [2] => Array ( [product_code] => prod4 [qty] => 7 ) )

简化版(不保留原键)

如果不需要保留原数组的键,只需要去重后的数组,可以更简洁:

$uniqueCart = [];
foreach ($cart as $item) {
    $uniqueCart[$item['product_code']] = $item;
}
// 重新索引数组(可选)
$result = array_values($uniqueCart);

灵活调整保留规则

如果之后你想改变保留条目的规则(比如保留qty更大的),只需要加个判断就行:

$temp = [];
foreach ($cart as $key => $item) {
    // 只有当该product_code未记录,或当前条目qty更大时才更新
    if (!isset($temp[$item['product_code']]) || $item['qty'] > $temp[$item['product_code']]['data']['qty']) {
        $temp[$item['product_code']] = ['original_key' => $key, 'data' => $item];
    }
}

这种方法比序列化的方式更高效,也更灵活,完全能满足你的多维数组按指定键去重的需求~

内容的提问来源于stack exchange,提问作者Alimin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:38:40