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

如何在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);

代码说明

  1. $seen数组用于记录已处理的vehicle_code-year组合,键为拼接后的字符串,值标记是否已存在。
  2. 遍历原始数组时,生成当前项的组合键,若未在$seen中出现过,则将该项加入结果数组,并标记组合键已存在。
  3. array_values用于重置索引,使结果数组索引连续,可根据需求选择是否执行。

该方法时间复杂度为O(n),效率高,精准匹配双字段组合去重需求,同时保留每个组合第一次出现的完整数组项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:20:28