如何将默认子数组值应用于关联多维数组?
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);
我需要帮助来合并多个数组。例如,我有 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);