2011-05-22 17 views
18

Duplicar posible:
PHP: How to sum values of the array of the same keycómo combinar dos matrices sumando los valores fusionados

Busco a una función array_merge() que no sustituye los valores, pero los añade.

ejemplo, este es el código que estoy tratando:

echo "<pre>"; 

    $a1 = array(
     "a" => 2 
     ,"b" => 0 
     ,"c" => 5 
    ); 

    $a2 = array(
     "a" => 3 
     ,"b" => 9 
     ,"c" => 7 
     ,"d" => 10 
    ); 

    $a3 = array_merge($a1, $a2); 
    print_r($a3); 

Lamentablemente, esta Muestra esto:

Array 
(
    [a] => 3 
    [b] => 9 
    [c] => 7 
    [d] => 10 
) 

Luego trató, en lugar de array_merge, simplemente añadiendo los dos arrays

$a3 = $a1 + $a2; 

Pero esto da salida a

Array 
(
    [a] => 2 
    [b] => 0 
    [c] => 5 
    [d] => 10 
) 

Lo que realmente quiero es poder pasar tantas matrices como sea necesario, y luego obtener su suma. Así que en mi ejemplo, quiero que la salida sea:

Array 
(
    [a] => 5 
    [b] => 9 
    [c] => 12 
    [d] => 10 
) 

Por supuesto que puedo schlepp y construir alguna función con muchas foreach etc, pero estoy buscando o una solución más elegante, más limpio. Gracias por cualquier punteros!

+2

Esto suena como el tipo de cosa para la que desea escribir una función. No lo consideraría "trampolín" de ninguna manera, esto es algo bastante único que quiero hacer. Sin embargo, podría demostrarse que estoy equivocado, pero no creo que haya ninguna función nativa que pueda manejar esto sola. Si la solución es escribir una función, ¿todavía necesita ayuda? –

+0

Creo que no hay una función incorporada que pueda hacer esto, verifique esta pregunta: http://stackoverflow.com/questions/1496682/php-how-to-sum-values-of-the-array-of-the -misma-clave –

+2

La pregunta está formulada mal. 'array_merge' * fusiona dos matrices al tiempo que mantiene ** todas ** las claves *. Pero desea * sumar el ** valor ** de teclas idénticas de dos matrices *, que es otra cosa. – deceze

Respuesta

3

no es tan complican hacer algo como:

$a3 = $a1; 

foreach($a2 as $k => $v) { 
    if(array_key_exists($k, $a3)) { 
     $a3[$k] += $v; 
    } else { 
     $a3[$k] = $v; 
    } 
} 
+1

'in_array' hace lo incorrecto aquí, estás buscando' isset' o 'array_key_exists'. – deceze

+1

gracias, es mi error lo arreglé –

9

Mi contribución:

function array_merge_numeric_values() 
{ 
    $arrays = func_get_args(); 
    $merged = array(); 
    foreach ($arrays as $array) 
    { 
     foreach ($array as $key => $value) 
     { 
      if (! is_numeric($value)) 
      { 
       continue; 
      } 
      if (! isset($merged[$key])) 
      { 
       $merged[$key] = $value; 
      } 
      else 
      { 
       $merged[$key] += $value; 
      } 
     } 
    } 
    return $merged; 
} 

paso a tantas agrupaciones como desee. Siéntase libre de agregar algo más de defensa, capacidad para aceptar matrices multidimensionales o verificación de tipos.

Demostración: http://codepad.org/JG6zwAap

41
$sums = array(); 
foreach (array_keys($a1 + $a2) as $key) { 
    $sums[$key] = (isset($a1[$key]) ? $a1[$key] : 0) + (isset($a2[$key]) ? $a2[$key] : 0); 
} 

Usted podría acortar este a la siguiente utilizando el operador de supresión de errores, pero debe ser considerada fea:

$sums = array(); 
foreach (array_keys($a1 + $a2) as $key) { 
    $sums[$key] = @($a1[$key] + $a2[$key]); 
} 

Alternativamente, algunos de mapeo:

$keys = array_fill_keys(array_keys($a1 + $a2), 0); 
$sums = array_map(function ($a1, $a2) { return $a1 + $a2; }, array_merge($keys, $a1), array_merge($keys, $a2)); 

o una especie de combinación de ambas soluciones:

$sums = array_fill_keys(array_keys($a1 + $a2), 0); 
array_walk($sums, function (&$value, $key, $arrs) { $value = @($arrs[0][$key] + $arrs[1][$key]); }, array($a1, $a2)); 

Creo que estos son suficientes para adaptar uno de ellos en el acto cuando sea necesario, pero para ponerlo en términos de una función que acepta un número ilimitado de matrices concisa y los suma:

function array_sum_identical_keys() { 
    $arrays = func_get_args(); 
    $keys = array_keys(array_reduce($arrays, function ($keys, $arr) { return $keys + $arr; }, array())); 
    $sums = array(); 

    foreach ($keys as $key) { 
     $sums[$key] = array_reduce($arrays, function ($sum, $arr) use ($key) { return $sum + @$arr[$key]; }); 
    } 
    return $sums; 
} 
+1

Ahora, ¿por qué se votó a favor, por favor? Puede parecer críptico, pero solo si no estás acostumbrado a pensar en conjuntos y funciones. IMO es mucho más elegante que los bucles anidados o toneladas de 'si's. – deceze

+7

+1 rango más interesante de soluciones :) –

+1

Tercera solución restableció claves de arreglo para mí. – Volvox

-4

Puede usar la función array_push.Espero que le ayudará a

foreach($a2 as $a2){ 
    array_push($a1, $a2); 
    } 

    print_r($a1); 

Output: 

Array 
(
    [a] => 2 
    [b] => 0 
    [c] => 5 
    [0] => 3 
    [1] => 9 
    [2] => 7 
    [3] => 10 
) 

O puede cambiar la lógica del valor llave con numbers.It funciona incluso que tiene igual número de la siguiente manera:

<?php 
$beginning = array(1 => 'foo'); 
$end = array(1 => 'bar'); 
$result = array_merge((array)$beginning, (array)$end); 
print_r($result); 
?> 

Output: 

Array (
[0] => foo 
[1] => bar 
) 

Enjoy !!!!!! !!!!!!!!

+3

-1 ¿Has leído la pregunta? –

Cuestiones relacionadas