如何将默认子数组值应用于关联多维数组?

How to apply default subarray values to an associative multidimensional array?

我需要帮助来合并多个数组。例如,我有 2 个不同的数组。

$array1 包含 ID 和金额。 $array2 将根据 ID 获得日期和金额。

$array1 = [
  310 => 0,
  311 => 0,
  312 => 0,
  313 => 0,
  314 => 0,
  315 => 0
];

$array2 = [
  "2019-05-17" => [
    312 => 3000.00
  ],
  "2019-06-20" => [
    312 => 3000.00
  ],
  "2019-06-27" => [
    313 => 5000.00,
    315 => 3000.00
  ]
];

我想要的最终输出:

$merge = [
    "2019-05-17" => [
      310 => 0,
      311 => 0,
      312 => 3000.00,
      313 => 0,
      314 => 0,
      315 => 0
    ],
    "2019-06-20" => [         
      310 => 0,
      311 => 0,
      312 => 3000.00,
      313 => 0,
      314 => 0,
      315 => 0
    ],
    "2019-06-27" => [
      310 => 0,       
      311 => 0,
      312 => 0,
      313 => 5000.00,
      314 => 0,
      315 => 3000.0
    ],
];

我可以知道如何实现它以便我会喜欢 $merge 吗?

您可以像模板一样使用您的第一个数组。

$newArray = [];
foreach($array2 as $date => $data) {
    $tmpArr = $array1;
    foreach ($data as $id=>$value) {
        if (!array_key_exists($id, $tmpArr)) {
            continue;
        }
        $tmpArr[$id] = $value;
    }
    $newArray[$date] = $tmpArr;
}

4行解决。看看代码中的注释。

$final = []; //Creates an empty array.
foreach ($array2 as $key => $value) {
    $final[$key] = $array1; #adds array1 to each key of array2 on new array.
}
$merge = array_replace_recursive($final, $array2); #merges new array with array2.

var_dump($merge); #returns the solution on your question.

不要重复两次。在单次遍历第二个数组时合并。

将两个数组与 "union operator" (+) 合并将导致键无序(这不是关联数组的典型问题)。要使用默认数组作为子数组键的 "guide",调用 array_replace() 作为合并函数。

代码:(Demo)

foreach ($array2 as &$row) {
    $row += $array1;
    ksort($row);  // if you care
}

或(Demo)

foreach ($array2 as &$row) {
    $row = array_replace($array1, $row);
}

输出:

array (
  '2019-05-17' => 
  array (
    310 => 0,
    311 => 0,
    312 => 3000.0,
    313 => 0,
    314 => 0,
    315 => 0,
  ),
  '2019-06-20' => 
  array (
    310 => 0,
    311 => 0,
    312 => 3000.0,
    313 => 0,
    314 => 0,
    315 => 0,
  ),
  '2019-06-27' => 
  array (
    310 => 0,
    311 => 0,
    312 => 0,
    313 => 5000.0,
    314 => 0,
    315 => 3000.0,
  ),
)

如果你在 php7.4 或更高版本,你可以使用 array_map() 和箭头语法作为单行。

代码:(Demo)

var_export(array_map(fn($row) => array_replace($array1, $row),$array2));

php7.4 之下的 array_map() 语法相当冗长。 Demo.

var_export(
    array_map(
        function($row) use ($array1) {
            return array_replace($array1, $row);
        },
        $array2
    )
);

只是为了好玩,这里有一个额外的技巧,包括嵌套循环(语言构造而不是函数调用)和空合并(一种内联条件表达式)。

代码:(Demo)

$merged = [];
foreach($array2 as $date => $row) {
    foreach ($array1 as $id => $value) {
        $merged[$date][$id] = $row[$id] ?? $value;
    }
}
var_export($merged);