我想按条件合并数组。如果数组键匹配,则添加值,如果不匹配则保留值。
以下是我的数组:
spring.jackson.date-format=com.fasterxml.jackson.databind.util.StdDateFormat
我想要的结果是:
Array1
(
[1] => 199
[3] => 1306
[5] => 199
)
Array2
(
[3] => 199
[4] => 199
)
我使用if-else条件,但它重复已经匹配的值。
这是我的编码尝试:
Result
(
[1] => 199
[3] => 1505
[4] => 199
[5] => 199
)
答案 0 :(得分:4)
我认为问题比看上去简单。你真的只需要一个条件来排除未定义的偏移通知。只需迭代两个数组中的所有键和值,并将值添加到合并数组中的相应键。
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);
来完成该输出
答案 1 :(得分:2)
首先,您可以通过合并同一个键中的所有值来合并数组:
$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
答案 2 :(得分:-1)
您可以通过
实现这一目标$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;
}
}