php - 合并 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}
]
任何帮助将不胜感激,越少越好
编辑:为包含特定拟合的第一个数组和第二个数组添加了说明
解决方案
可能最简单的方法是按品牌/型号/年份重新索引第一个数组,然后遍历第二个数组,寻找相同的汽车,如果找到,更新记录,否则在输出。然后可以使用以下方法对结果数组进行数字重新索引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
)
)
推荐阅读
- flutter - 如何在 Flutter 中动态调整容器大小时保持裁剪区域不变?
- python - 在 matplotlib 子图中的主图旁边添加两个较小的子图
- android - Android Studio 不建议 Firebase BOM 新版本
- python - 从 Google Drive 下载大量小文件
- r - 错误:“tidyverse”的包或命名空间加载失败:“命名空间:dplyr”未导出对象“重定位”
- python - 在大量网站上搜索关键字
- reactjs - 如何使用样式化组件更改 antd 轮播点的形状和颜色
- fortran - 如何自动将间隔数加倍
- javascript - 如何防止打字稿将动态导入转换为require()?
- xss - 通过 CSS 选择器的 XSS