首页 > 解决方案 > 合并 2 个具有一些重复值的多维数组

问题描述

我有两个有时具有匹配键的数组,我需要根据匹配字段(品牌/型号/年份)合并这些值,并根据每个数组对象具有的值标志进行相应设置(在这种情况下适合:B 或适合:R

第一个数组看起来像这样并且包含适合 B 的:

$firstArray = [
 { Model: Aston Martin, Make: V12, Year: 2012, fit: B, front_fit: 52, rear_fit: null}
]

这是第二个数组,它只包含适合 R 的:

$secondArray = [
 { Model: Aston Martin, Make: V12, Year: 2012, fit: R, front_fit: null, rear_fit: 24}
]

请注意大多数值是如何相同的,除了 fit 以及基于该标志(B 或 R)的前或后匹配。理想情况下,我想将这两个合并到一个新数组中,该数组将删除拟合并相应地填写 front_fit 和 back_fit 字段:

$mergedNewArray = [
 { Model: Aston Martin, Make: V12, Year: 2012, front_fit: 52, rear_fit: 24}
]

可能会发生第三种情况,其中一个数组中可能没有匹配的模型/品牌/年份对象,如果是这种情况,我仍然想在新数组中包含现有记录

所以它会变成这样:

$mergedNewArray = [
 { Model: Aston Martin, Make: V12, Year: 2012, front_fit: 52, rear_fit: 24},
  //This has no matching object to merge with but should still be in this array
 { Model: Dodge, Make: Charger, Year: 2006, front_fit: null, rear_fit: 80} 
]

任何帮助将不胜感激,越少越好

编辑:为包含特定拟合的第一个数组和第二个数组添加了说明

标签: phparrays

解决方案


可能最简单的方法是按品牌/型号/年份重新索引第一个数组,然后遍历第二个数组,寻找相同的汽车,如果找到,更新记录,否则在输出。然后可以使用以下方法对结果数组进行数字重新索引array_values

$firstArray = json_decode('[
 { "Model": "Aston Martin", "Make": "V12", "Year": 2012, "fit": "B", "front_fit": 52, "rear_fit": null },
 { "Model": "Aston Martin", "Make": "Vantage", "Year": 2017, "fit": "B", "front_fit": 40, "rear_fit": null }
]', true);

$secondArray =json_decode('[
 { "Model": "Aston Martin", "Make": "V12", "Year": 2012, "fit": "R", "front_fit": null, "rear_fit": 24 },
 { "Model": "Dodge", "Make": "Charger", "Year": 2006, "fit": "R", "front_fit": null, "rear_fit": 80 }
]', true);

$result = array();
// index the first array by the model, make and year
foreach ($firstArray as $car) {
    unset($car['fit']);
    $key = $car['Model'] . '#' . $car['Make'] . '#' . $car['Year'];
    $result[$key] = $car;
}

foreach ($secondArray as $car) {
    $key = $car['Model'] . '#' . $car['Make'] . '#' . $car['Year'];
    // have we seen this car?
    if (isset($result[$key])) {
        // if so, update
        $result[$key]['rear_fit'] = $car['rear_fit'];
    }
    else {
        // create a new entry
        unset($car['fit']);
        $result[$key] = $car;
    }
}
// reindex to numeric keys
$result = array_values($result);
print_r($result);

输出:

Array
(
    [0] => Array
        (
            [Model] => Aston Martin
            [Make] => V12
            [Year] => 2012
            [front_fit] => 52
            [rear_fit] => 24
        )
    [1] => Array
        (
            [Model] => Aston Martin
            [Make] => Vantage
            [Year] => 2017
            [front_fit] => 40
            [rear_fit] => 
        )
    [2] => Array
        (
            [Model] => Dodge
            [Make] => Charger
            [Year] => 2006
            [front_fit] => 
            [rear_fit] => 80
        )
)

3v4l.org 上的演示


推荐阅读