0

如何组合这两个数组,以使键保持不变,但值是通过算术确定的?

注意 - 根据我的示例,键可能并不总是在每个数组中排列:

$Array1 = ([4] => 100, [5] => 200, [6] => 100, [7] => 400 );
$Array2 = ([2] => 300, [5] => -100,  [16] => -500, );

期望的输出:

$Array3 = ([2] => 300, [4] => 100, [5] => 100, [6] => 100, [7] => 400, [16] => -500);

编辑:改进数组以突出为什么“foreach”不起作用

4

2 回答 2

6

您可以array_map为此使用:

$Array3 = array_map(function($a,$b) {return $a+$b;},$Array1,$Array2);

但是,这仅在两个数组中具有相同键的情况下才有效(在您的示例中,您没有)。

如果这是一个问题,最简单的解决方法可能是:

$allKeys = array_merge(array_keys($Array1),array_keys($Array2));
$Array3 = Array();
foreach($allKeys as $k) {
    $Array3[$k] = (isset($Array1[$k]) ? $Array1[$k] : 0)
                 +(isset($Array2[$k]) ? $Array2[$k] : 0);
}

编辑刚刚意识到上面的代码不是最优的。重写:

$allKeys = array_unique(array_merge(array_keys($Array1),array_keys($Array2)));
// rest of code as above

实际上不确定重复键的开销是否大于或小于检查唯一性的开销......

于 2012-06-11T01:28:33.513 回答
4

您可以foreach覆盖每个数组并将它们添加到结果数组中。

//$array3 = array();

//foreach($array1 as $k=>$v){
//    $array3[$k] = $v;
//}

$array3 = $array1;

foreach($array2 as $k=>$v){
    $array3[$k] = isset($array3[$k]) ? $array3[$k]+$v : $v;
}
于 2012-06-11T01:31:37.607 回答