如何对含关联数组的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
相关产品推荐
相关产品推荐

