合并关联数组的索引数组并对重复键的值求和
Merge indexed array of associative arrays and sum the values of recurring keys
我有一个多维数组,如下所示:
Array
(
[0] => Array
(
[GB] => 20827
[US] => 73
[ES] => 23
[AU] => 15
[DE] => 12
[MY] => 4
[QA] => 1
[VN] => 1
[SK] => 1
[FJ] => 1
[ME] => 1
[TR] => 1
[LV] => 1
)
[1] => Array
(
[GB] => 15070
[US] => 3920
[IE] => 1711
[PH] => 1071
[MT] => 578
[AU] => 423
[HR] => 241
[ZA] => 210
[FR] => 139
)
)
我想用多维数组的每个数组中的所有关联元素创建一个新数组,并对重复键的值求和。
样本输入的期望结果:
array (
'GB' => 35897,
'US' => 3993,
'ES' => 23,
'AU' => 438,
'DE' => 12,
'MY' => 4,
'QA' => 1,
'VN' => 1,
'SK' => 1,
'FJ' => 1,
'ME' => 1,
'TR' => 1,
'LV' => 1,
'IE' => 1711,
'PH' => 1071,
'MT' => 578,
'HR' => 241,
'ZA' => 210,
'FR' => 139,
)
可能是
$array = count($array1) > count($array2) ? $array1 : $array2;
$otherArray = count($array1) > count($array2) ? $array2 : $array1;
array_walk($array, function(&$value, $key, $otherArray) {
$value = $value + (isset($otherArray[$key]) ? $otherArray[$key] : 0);
}, $otherArray);
遍历每个子数组,然后遍历 key/value 对。将它们添加到 $final
数组中:
$final = [];
foreach($masterArray as $subArray) {
foreach($subArray AS $key => $value) {
$final[$key] = isset($final[$key])
? $final[$key] + $value
: $value;
}
}
您可以通过将第一行数据“移出”输入数组并将关联元素直接推入输出数组来快速跟踪此任务。这消除了对第一行执行任何条件操作的需要,这将提高效率。
代码:(Demo)
$result = array_shift($array);
foreach ($array as $row) {
foreach ($row as $key => $value) {
$result[$key] = ($result[$key] ?? 0) + $value;
}
}
var_export($result);
array_reduce()
的替代方案:(Demo)
$result = array_shift($array);
var_export(
array_reduce(
$array,
function($result, $row) {
foreach ($row as $key => $value) {
$result[$key] = ($result[$key] ?? 0) + $value;
}
return $result;
},
$result
)
);
替代 array_merge_recursive()
:(Demo)
$result = array_shift($array);
array_walk_recursive(
$array,
function($value, $key) use(&$result) {
$result[$key] = ($result[$key] ?? 0) + $value;
}
);
var_export($result);
作为使用 array_shift()
的副作用,如果输入数组为空,则以上所有片段的输出将是 null
而不是空数组。如果这对您的项目来说是一个破坏交易的因素,则将 array_shift()
替换为一个空数组 -- Demo.
我有一个多维数组,如下所示:
Array
(
[0] => Array
(
[GB] => 20827
[US] => 73
[ES] => 23
[AU] => 15
[DE] => 12
[MY] => 4
[QA] => 1
[VN] => 1
[SK] => 1
[FJ] => 1
[ME] => 1
[TR] => 1
[LV] => 1
)
[1] => Array
(
[GB] => 15070
[US] => 3920
[IE] => 1711
[PH] => 1071
[MT] => 578
[AU] => 423
[HR] => 241
[ZA] => 210
[FR] => 139
)
)
我想用多维数组的每个数组中的所有关联元素创建一个新数组,并对重复键的值求和。
样本输入的期望结果:
array (
'GB' => 35897,
'US' => 3993,
'ES' => 23,
'AU' => 438,
'DE' => 12,
'MY' => 4,
'QA' => 1,
'VN' => 1,
'SK' => 1,
'FJ' => 1,
'ME' => 1,
'TR' => 1,
'LV' => 1,
'IE' => 1711,
'PH' => 1071,
'MT' => 578,
'HR' => 241,
'ZA' => 210,
'FR' => 139,
)
可能是
$array = count($array1) > count($array2) ? $array1 : $array2;
$otherArray = count($array1) > count($array2) ? $array2 : $array1;
array_walk($array, function(&$value, $key, $otherArray) {
$value = $value + (isset($otherArray[$key]) ? $otherArray[$key] : 0);
}, $otherArray);
遍历每个子数组,然后遍历 key/value 对。将它们添加到 $final
数组中:
$final = [];
foreach($masterArray as $subArray) {
foreach($subArray AS $key => $value) {
$final[$key] = isset($final[$key])
? $final[$key] + $value
: $value;
}
}
您可以通过将第一行数据“移出”输入数组并将关联元素直接推入输出数组来快速跟踪此任务。这消除了对第一行执行任何条件操作的需要,这将提高效率。
代码:(Demo)
$result = array_shift($array);
foreach ($array as $row) {
foreach ($row as $key => $value) {
$result[$key] = ($result[$key] ?? 0) + $value;
}
}
var_export($result);
array_reduce()
的替代方案:(Demo)
$result = array_shift($array);
var_export(
array_reduce(
$array,
function($result, $row) {
foreach ($row as $key => $value) {
$result[$key] = ($result[$key] ?? 0) + $value;
}
return $result;
},
$result
)
);
替代 array_merge_recursive()
:(Demo)
$result = array_shift($array);
array_walk_recursive(
$array,
function($value, $key) use(&$result) {
$result[$key] = ($result[$key] ?? 0) + $value;
}
);
var_export($result);
作为使用 array_shift()
的副作用,如果输入数组为空,则以上所有片段的输出将是 null
而不是空数组。如果这对您的项目来说是一个破坏交易的因素,则将 array_shift()
替换为一个空数组 -- Demo.