使用另一个二维数组中的映射值向二维数组添加新列,否则使用默认值零

问题描述 投票:0回答:2

我需要根据共享 ID 列值合并两个二维数组中的数据。将 NUM 值从第二个数组传输到第一个数组时,如果没有对应的行,则默认 NUM 值为 0。

$array1 = [
    ['ID' => 1],
    ['ID' => 2],
    ['ID' => 3],
    ['ID' => 4],
    ['ID' => 5],
];

$array2 = [
    ['ID' => 2, 'NUM' => 200],
    ['ID' => 4, 'NUM' => 400],
];

想要的结果:

[
    ['ID' => 1, 'NUM' => 0],
    ['ID' => 2, 'NUM' => 200],
    ['ID' => 3, 'NUM' => 0],
    ['ID' => 4, 'NUM' => 400],
    ['ID' => 5, 'NUM' => 0],
]

我尝试了

array_diff()
array_intersect()
,但找不到正确的解决方案。

php arrays multidimensional-array mapping default-value
2个回答
0
投票

您可以循环遍历 array1 并为当前键添加 array2 的值,如果 array2 中未设置该键,则添加 0。

foreach ($array1 as $key => $value) {
  if (array_key_exists($key, $array2) {
    $array1[$key] = $array2[$key];
  } else {
    $array1[$key] = 0;
  }
}

0
投票

为了避免第二个数组的低效迭代搜索,请填充关联查找/映射以允许即时值访问。如果在查找中没有找到 ID,则默认新元素为 0。

代码:(演示)

$array1 = [
    ['ID' => 1],
    ['ID' => 2],
    ['ID' => 3],
    ['ID' => 4],
    ['ID' => 5],
];
$array2 = [
    ['ID' => 2, 'NUM' => 200],
    ['ID' => 4, 'NUM' => 400],
];

$lookup = array_column($array2, null, 'ID');
var_export(
    array_map(
        fn($row) => $row + ($lookup[$row['ID']] ?? ['NUM' => 0]),
        $array1
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.