如何在PHP/Laravel中基于双字段对多维数组去重
PHP多维数组按双字段组合去重
我有一个包含vehicle_code、year等字段的多维数组,其中存在同一year下vehicle_code重复的情况,需要移除vehicle_code和year组合重复的数组项。尝试过in_array、array_column、array_search等数组函数,但现有示例均为单字段去重,无法满足双字段组合去重的需求。
原始数组示例
$originalArray = [ [ "AUA3H147", 2015, "Audi", 12457 ], [ "AUA3H147", 2015, "tata", 16832545 ], [ "AUA3H148", 2016, "tata", 55555 ], [ "AUA3H148", 2017, "Audi", 55555 ] ];
期望输出
$expectedArray = [ [ "AUA3H147", 2015, "Audi", 12457 ], [ "AUA3H148", 2016, "tata", 55555 ], [ "AUA3H148", 2017, "Audi", 55555 ] ];
尝试过的无效方法
方法一
$newArray = array(); $addArrayValues = array(); $priceVehicleYearCounter = 0; foreach ( $excelPriceArr as $key => $line ) { if ( (!in_array($line[0], $addArrayValues)) && (!in_array($line[1], $addArrayValues)) ) { $addArrayValues[$priceVehicleYearCounter] = array( 'id' => $priceVehicleYearCounter, 'vehicle_code' => $line[0], 'year' => $line[1], ); $priceVehicleYearCounter++; $newArray[$priceVehicleYearCounter] = $line; } }
问题:逻辑错误,in_array判断单个值是否存在,而非组合值,会误判不同组合但单个值重复的情况。
方法二
if(array_search($line, array_column($addArrayValues, 'vehicle_code','year')) == false) { $addArrayValues[$priceVehicleYearCounter] = array( 'id' => $priceVehicleYearCounter, 'vehicle_code' => $line[0], 'year' => $line[1], ); $priceVehicleYearCounter++; $newArray[$priceVehicleYearCounter] = $line; }
问题:array_search参数错误,array_column返回的是year为键、vehicle_code为值的数组,用整个$line搜索完全不匹配。
方法三
$result = array_unique($addArrayValues, SORT_REGULAR); $result = array_map("unserialize", array_unique(array_map("serialize", $addArrayValues)));
问题:array_unique(含序列化去重)判断整个数组项是否完全相同,而需求是仅按vehicle_code+year组合去重,其他字段不同的情况也需保留第一个出现的项,因此不适用。
数组完整示例项
$fullItem = [ "AUA3H142", 2013, "AUDI", "A3 SPORTBACK", "1.8 TFSI AMBITION (01/2011-04/2013)", "1.8 TFSI AMBITION", 2209, 500, 12023, 125648, 118835, "Private" ];
正确解决方案
核心思路:用vehicle_code和year拼接成唯一标识作为键,遍历数组时记录已出现的组合,只保留第一次出现的项。
$uniqueArray = []; $seen = []; foreach ($originalArray as $item) { // 生成组合键,格式为"vehicle_code-year" $key = $item[0] . '-' . $item[1]; if (!isset($seen[$key])) { $seen[$key] = true; $uniqueArray[] = $item; } } // 可选:重置数组索引,确保索引连续 $uniqueArray = array_values($uniqueArray);
代码说明
$seen数组用于记录已处理的vehicle_code-year组合,键为拼接后的字符串,值标记是否已存在。- 遍历原始数组时,生成当前项的组合键,若未在
$seen中出现过,则将该项加入结果数组,并标记组合键已存在。 array_values用于重置索引,使结果数组索引连续,可根据需求选择是否执行。
该方法时间复杂度为O(n),效率高,精准匹配双字段组合去重需求,同时保留每个组合第一次出现的完整数组项。
内容的提问来源于stack exchange,提问作者Arivazhagan E
相关产品推荐
相关产品推荐

