Suma de valores en mi matriz

Tengo una matriz como la siguiente, y quiero hacer el total de valores de una manera específica donde todos los valores de val1_(.*) {expresiones regulares} y otros valores similares. Solo tengo valores específicos como val1, val2 y val3.

Mi matriz es como:

$stats = Array
(
    [ADDED_NEW_2012_06_12] => 16
    [ADDED_OLD_2012_06_12] => 10
    [ADD_LATER_2012_06_12] => 12
    [ADDED_NEW_2012_06_11] => 16
    [ADDED_OLD_2012_06_11] => 10
    [ADD_LATER_2012_06_11] => 12
)

¿Puede decirme cómo puedo obtener mi resultado? No sé cómo agregar tales valores usando expresiones regulares en php. Por favor ayuda.

preguntado el 12 de junio de 12 a las 14:06

¿Cuál es el nombre de su objeto de matriz? -

5 Respuestas

No necesariamente necesita una expresión regular si puede identificar los valores por la primera parte de la clave.

Iterar sobre la matriz y crear una nueva matriz con un elemento para cada valX:

$totals = array();

// iterate over the array
foreach($array as $key => $value) {
    $k = substr($key, 0, strpos($key, '_')); // get the first part (i.e. `valX`)
    if(!isset($totals[$k])) { // if $totals['valX'] does not exist, initialize
        $totals[$k] = 0;
    }
    $totals[$k] += $value; // sum
}

Referencia: foreach, substr, strpos, isset

Respondido el 12 de junio de 12 a las 14:06

en realidad, val1 y val2 fueron solo el ejemplo, mis claves de matriz reales son ADDED_NEW_2012_06_12, ADDED_NEW_2012_06_11, etc. ¿Puedo modificar su código para mi situación? - Thompson

Si no lo modifica, no puede aplicarlo a su situación, ¿o sí? ;) ¡Por supuesto! Las respuestas normalmente no dan y no deberían dar soluciones de copiar y pegar de todos modos, solo una idea general. - Félix Kling

¿Quieres decir esto?

$array = array (
  'val1_2012_06_12' => 16,
  'val2_2012_06_12' => 10,
  'val3_2012_06_12' => 12,
  'val1_2012_06_11' => 16,
  'val2_2012_06_11' => 10,
  'val3_2012_06_11' => 12,
);

$sums = array();

foreach ($array as $key => $value) {
  $regex = '~(?P<prefix>val\d+)_\d{4}_\d{2}_\d{2}~';

  if (preg_match($regex, $key, $matches)) {
    $sums[$matches['prefix']] += $value;
  }
}

Producirá algo como esto, agrupará las sumas por prefijos:

Array
(
    [val1] => 32
    [val2] => 20
    [val3] => 24
)

Respondido el 12 de junio de 12 a las 14:06

en realidad, val1 y val2 fueron solo el ejemplo, mis claves de matriz reales son ADDED_NEW_2012_06_12, ADDED_NEW_2012_06_11, etc. ¿Puedo modificar su código para mi situación? - Thompson

@Mohan Sinfh, por supuesto, puede modificar el código, solo necesita modificar la parte "val \ d +" con el patrón apropiado. - ioseb

Editar: actualizado a la pregunta refinada

Puede hacer coincidir la clave con un código y crear una suma a partir de ahí como esta con un bucle foreach simple.

$array = array(
    'ADDED_NEW_2012_06_12' => 16,
    'ADDED_OLD_2012_06_12' => 10,
    'ADD_LATER_2012_06_12' => 12,
    'ADDED_NEW_2012_06_11' => 16,
    'ADDED_OLD_2012_06_11' => 10,
    'ADD_LATER_2012_06_11' => 12,
);


$sumarray = array();
foreach ($array as $key => $value)
{
   $matches = array();
   preg_match("/^(\w+?_\w+?)_/i", $key, $matches);
   $key = $matches[1];
   if (!isset($sumarray[$key]))
   {
      $sumarray[$key] = $value;
   } else {
      $sumarray[$key] = $sumarray[$key] + $value;
   }
}

print_r($sumarray);

Respondido el 13 de junio de 12 a las 09:06

en realidad, val1 y val2 fueron solo el ejemplo, mis claves de matriz reales son ADDED_NEW_2012_06_12, ADDED_NEW_2012_06_11, etc. ¿Puedo modificar su código para mi situación? - Thompson

si solo tiene este tipo de valor de árbol en la matriz, puede usar esto:

$stats = Array(
    'ADDED_NEW_2012_06_12' => 16,
    'ADDED_OLD_2012_06_12' => 10,
    'ADD_LATER_2012_06_12' => 12,
    'ADDED_NEW_2012_06_11' => 16,
    'ADDED_OLD_2012_06_11' => 10,
    'ADD_LATER_2012_06_11' => 12
);  

foreach($stats as $key => $value)
{
 $substring=substr($key, 0 , 9);
  if($substring=='ADDED_NEW')
    @$ADDED_NEW += $value;
  elseif($substring=='ADDED_OLD')
    @$ADDED_OLD += $value;
  else
    @$ADD_LATER += $value;
}
echo 'ADDED_NEW : ' . $ADDED_NEW .'<br>ADDED_OLD : ' . $ADDED_OLD .'<br>ADD_LATER : ' . $ADD_LATER ; 

salida:

ADDED_NEW : 32
ADDED_OLD : 20
ADD_LATER : 24

Respondido el 14 de junio de 12 a las 10:06

en realidad, val1 y val2 fueron solo el ejemplo, mis claves de matriz reales son ADDED_NEW_2012_06_12, ADDED_NEW_2012_06_11, etc. ¿Puedo modificar su código para mi situación? - Thompson

Código actualizado. si tiene más del tipo de árbol de ADD (value) en la matriz, puede usar switch (case :) dentro de foreach. - Rostami

$suma = 0; Foreach($objeto como $clave=>$valor){ $suma += $valor; }

Respondido el 12 de junio de 12 a las 14:06

Ups. Estoy fuera. ¡No se pueden hacer expresiones regulares en iPhone! - Luc

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.