如何合并两个数组并对重复键的值求和?
How to merge two arrays and sum the values of duplicate keys?
我想按条件合并数组。如果数组键匹配则添加值,如果不匹配则保留值。
这是我的数组:
Array1
(
[1] => 199
[3] => 1306
[5] => 199
)
Array2
(
[3] => 199
[4] => 199
)
我想要的结果是:
Result
(
[1] => 199
[3] => 1505
[4] => 199
[5] => 199
)
我使用了 if-else 条件,但它重复了已经匹配的值。
这是我的编码尝试:
$all=array();
foreach($sall as $sskey => $ssvalue){
foreach($upgradesall as $uukey => $uuvalue){
//$sskey==$uukey?$all[] = array("id"=>$sskey, "amount"=>$ssvalue+$uuvalue):($sskey!=$uukey? $all[] = array("id"=>$sskey, "amount"=>$ssvalue):($uukey!=$sskey?$all[] = array("id"=>$uukey, "amount"=>$uuvalue):''));
if($sskey===$uukey){
$all[] = array("id"=>$sskey, "amount"=>$ssvalue+$uuvalue);
}elseif($sskey!=$uukey){
$all[] = array("id"=>$sskey, "amount"=>$ssvalue);
}elseif($uukey!=$sskey){
$all[] = array("id"=>$uukey, "amount"=>$uuvalue);
}
}
}
您可以通过
实现
$all = array_merge($arr1,$arr2); // existing elements in arr1 are replaced by arr2 else merge into new array_merge
//then add replaced elememnts value
foreach($arr1 as $k=>$v)
{
if(array_key_exists($k,$all))
{
$all[$k] = $all[$k] + $v;
}
}
首先,您可以通过将所有值合并到同一个键中来合并数组:
$allKeys = array_unique(array_merge(array_keys($arr1),array_keys($arr2)));
$result = [];
foreach ($allKeys as $key) {
$result[$key] = [];
if (array_key_exists($key,$arr1)) {
$result[$key][] = $arr1[$key];
}
if (array_key_exists($key,$arr2)) {
$result[$key][] = $arr2[$key];
}
}
这将导致:
Array
(
[1] => Array
(
[0] => 199
)
[3] => Array
(
[0] => 1306
[1] => 199
)
[5] => Array
(
[0] => 199
)
[4] => Array
(
[0] => 199
)
)
那你就可以根据自己的情况进行映射了:
$endResult = array_map('array_sum',$result);
结果:
Array
(
[1] => 199
[3] => 1505
[5] => 199
[4] => 199
)
如果您希望对键进行排序,您也可以 运行 通过 ksort
对它们进行排序
查看代码:
http://sandbox.onlinephpfunctions.com/code/3eb23310f0fd8de8174a5caf8b2b91d4b7562b6b
我认为问题比看起来简单。你真的只需要一个条件来排除未定义的偏移量通知。只需迭代两个数组中的所有键和值,并将值添加到合并数组中的相应键。
foreach ([$a1, $a2] as $a) { // iterate both arrays
foreach ($a as $key => $value) { // iterate all keys+values
$merged[$key] = $value + ($merged[$key] ?? 0); // merge and add
}
}
实际上,实际执行加法 ($merged[$key] = $value + ($merged[$key] ?? 0);
) 的行可以减少到 $merged[$key] += $value;
。这仍然有效,但它会产生一堆未定义的偏移量通知。因此,我们可以将键设置为等于值加上先前的值(如果存在)或零。
如果您仍在使用 PHP 5,则可以使用三元代替空合并运算符 (??
),如下所示:
$merged[$key] = $value + (isset($merged[$key]) ? $merged[$key] : 0);
输出的顺序与您想要的结果不同,但您可以使用 ksort($merged);
来实现
我想按条件合并数组。如果数组键匹配则添加值,如果不匹配则保留值。
这是我的数组:
Array1
(
[1] => 199
[3] => 1306
[5] => 199
)
Array2
(
[3] => 199
[4] => 199
)
我想要的结果是:
Result
(
[1] => 199
[3] => 1505
[4] => 199
[5] => 199
)
我使用了 if-else 条件,但它重复了已经匹配的值。
这是我的编码尝试:
$all=array();
foreach($sall as $sskey => $ssvalue){
foreach($upgradesall as $uukey => $uuvalue){
//$sskey==$uukey?$all[] = array("id"=>$sskey, "amount"=>$ssvalue+$uuvalue):($sskey!=$uukey? $all[] = array("id"=>$sskey, "amount"=>$ssvalue):($uukey!=$sskey?$all[] = array("id"=>$uukey, "amount"=>$uuvalue):''));
if($sskey===$uukey){
$all[] = array("id"=>$sskey, "amount"=>$ssvalue+$uuvalue);
}elseif($sskey!=$uukey){
$all[] = array("id"=>$sskey, "amount"=>$ssvalue);
}elseif($uukey!=$sskey){
$all[] = array("id"=>$uukey, "amount"=>$uuvalue);
}
}
}
您可以通过
实现$all = array_merge($arr1,$arr2); // existing elements in arr1 are replaced by arr2 else merge into new array_merge
//then add replaced elememnts value
foreach($arr1 as $k=>$v)
{
if(array_key_exists($k,$all))
{
$all[$k] = $all[$k] + $v;
}
}
首先,您可以通过将所有值合并到同一个键中来合并数组:
$allKeys = array_unique(array_merge(array_keys($arr1),array_keys($arr2)));
$result = [];
foreach ($allKeys as $key) {
$result[$key] = [];
if (array_key_exists($key,$arr1)) {
$result[$key][] = $arr1[$key];
}
if (array_key_exists($key,$arr2)) {
$result[$key][] = $arr2[$key];
}
}
这将导致:
Array
(
[1] => Array
(
[0] => 199
)
[3] => Array
(
[0] => 1306
[1] => 199
)
[5] => Array
(
[0] => 199
)
[4] => Array
(
[0] => 199
)
)
那你就可以根据自己的情况进行映射了:
$endResult = array_map('array_sum',$result);
结果:
Array
(
[1] => 199
[3] => 1505
[5] => 199
[4] => 199
)
如果您希望对键进行排序,您也可以 运行 通过 ksort
对它们进行排序
查看代码:
http://sandbox.onlinephpfunctions.com/code/3eb23310f0fd8de8174a5caf8b2b91d4b7562b6b
我认为问题比看起来简单。你真的只需要一个条件来排除未定义的偏移量通知。只需迭代两个数组中的所有键和值,并将值添加到合并数组中的相应键。
foreach ([$a1, $a2] as $a) { // iterate both arrays
foreach ($a as $key => $value) { // iterate all keys+values
$merged[$key] = $value + ($merged[$key] ?? 0); // merge and add
}
}
实际上,实际执行加法 ($merged[$key] = $value + ($merged[$key] ?? 0);
) 的行可以减少到 $merged[$key] += $value;
。这仍然有效,但它会产生一堆未定义的偏移量通知。因此,我们可以将键设置为等于值加上先前的值(如果存在)或零。
如果您仍在使用 PHP 5,则可以使用三元代替空合并运算符 (??
),如下所示:
$merged[$key] = $value + (isset($merged[$key]) ? $merged[$key] : 0);
输出的顺序与您想要的结果不同,但您可以使用 ksort($merged);
来实现