【问题标题】:Merge 2 Multi-dimensional arrays with some duplicate values合并 2 个具有一些重复值的多维数组
【发布时间】:2020-10-22 22:38:27
【问题描述】:

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

第一个数组看起来像这样,包含 fit 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)的前或后匹配。理想情况下,我想将这两个合并到一个新数组中,该数组将删除 fit 并相应地填写 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} 
]

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

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

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    可能最简单的方法是按品牌/型号/年份重新索引第一个数组,然后遍历第二个数组,查找相同的汽车,如果找到,更新记录,否则创建一个输出中的新条目。然后可以使用 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
            )
    )
    

    Demo on 3v4l.org

    【讨论】:

    • 我认为这很接近,但我应该澄清一下,第一个数组只会包含 fit B,第二个数组只会包含 fit R,所以我相信条件永远不会在第二个for循环
    • @BRose 在这种情况下,您可以将foreach 简化为$secondArray。查看我的编辑;我还扩展了示例数据,使其在第一个数组中也有一个不匹配的值。
    • 谢谢这是我最终选择的路线,效果很好,非常感谢!
    • @BRose 不用担心 - 我很高兴能帮上忙。
    猜你喜欢
    • 2012-05-08
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2019-12-14
    相关资源
    最近更新 更多