¿Cómo puedo sumar todos los valores de una clave de matriz específica de forma recursiva?

3 minutos de lectura

avatar de usuario
Alex Pluutau

Tengo una matriz como esta:

Array
(
    [1000] => Array
        (
            [pv] => 36
        )

    [1101] => Array
        (
            [1102] => Array
                (
                    [pv] => 92
                )

            [pv] => 38
        )

    [pv] => 64
)

¿Cómo puedo encontrar la suma de todos los elementos de la matriz con la clave ‘pv’, independientemente de la profundidad a la que aparezcan?

Para este ejemplo el resultado será 36+92+38+64 = 230

  • Medoo: stackoverflow.com/questions/3777134/…, stackoverflow.com/questions/3776798/php-array-recursion, …

    – la noche

    23 de septiembre de 2010 a las 11:57

function SumRecursiveByKey($array,$key)
{
    $total = 0;
    foreach($array as $_key => $value)
    {
        if(is_array($value))
        {
            $total += SumRecursiveByKey($array,$key);
        }elseif($_key == $key)
        {
             $total += $value;
        }
    }
    return $total;
}

usar como

$summed_items = SumRecursiveByKey($myArray,'pv');

Esto le daría más margen de maniobra para verificar las teclas alternativas.

avatar de usuario
russell dias

Otra alternativa:

$sum = 0;
$array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
foreach($array_obj as $key => $value) {
    if($key == 'pv')
        $sum += $value;
}
echo $sum;

Actualizar: Solo pensé en mencionar que este método usa el PHP Iteradores SPL.


Salathe Editar:

Una forma simple (relativamente) de filtrar las claves y sumar los valores (sin escribir un iterador personalizado) sería filtrar con un RegexIteratorconvierta el iterador resultante en una matriz y utilice la práctica array_sum función en él. Esto es puramente un ejercicio académico y ciertamente no lo recomendaría como el mejor manera de lograr esto… sin embargo, es solo una línea de código. 🙂

$sum = array_sum(
    iterator_to_array(
        new RegexIterator(
            new RecursiveIteratorIterator(
                new RecursiveArrayIterator($array)
            ),
            '/^pv$/D',
            RegexIterator::MATCH,
            RegexIterator::USE_KEY
        ),
        false
    )
);

  • +1! ¡Este también es agradable! No requiere una función adicional y no abarrota el espacio de nombres. ¡Me gusta!

    – jwueller

    23 de septiembre de 2010 a las 12:11

  • +1 para IteratorIterator Recientemente usé esto para recorrer directorios para encontrar ciertos archivos con RegexIteratorIterator.

    – Chris

    23 de septiembre de 2010 a las 12:18

  • +1: Además, incluso podría agregar un FilterIterator y no tener que preocuparse por la parte `if($key == ‘pv’)“… Pero esto es correcto de cualquier manera…

    – ircmaxell

    23 de septiembre de 2010 a las 12:27

  • @ircmaxell, @erisco Cue ridículo comentario de una sola línea… $sum = array_sum(iterator_to_array(new RegexIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)), '/^pv$/D', RegexIterator::MATCH,RegexIterator::USE_KEY), false));

    – Salathe

    24 de septiembre de 2010 a las 8:45


  • Sí, eso es ridículo. Una muestra impresionante de lo que puedes hacer con SPL, pero sigue siendo ridícula.

    – ircmaxell

    24 de septiembre de 2010 a las 11:07

avatar de usuario
Ali Sattari

puedes usar array_reduce o array_walk_recursive funciones y una función de devolución de llamada personalizada de usted mismo:

function sum($v, $w)
{
    $v += $w;
    return $v;
}

$total = array_reduce($your_array, "sum");

  • +1! ¡Este también es agradable! No requiere una función adicional y no abarrota el espacio de nombres. ¡Me gusta!

    – jwueller

    23 de septiembre de 2010 a las 12:11

  • +1 para IteratorIterator Recientemente usé esto para recorrer directorios para encontrar ciertos archivos con RegexIteratorIterator.

    – Chris

    23 de septiembre de 2010 a las 12:18

  • +1: Además, incluso podría agregar un FilterIterator y no tener que preocuparse por la parte `if($key == ‘pv’)“… Pero esto es correcto de cualquier manera…

    – ircmaxell

    23 de septiembre de 2010 a las 12:27

  • @ircmaxell, @erisco Cue ridículo comentario de una sola línea… $sum = array_sum(iterator_to_array(new RegexIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)), '/^pv$/D', RegexIterator::MATCH,RegexIterator::USE_KEY), false));

    – Salathe

    24 de septiembre de 2010 a las 8:45


  • Sí, eso es ridículo. Una muestra impresionante de lo que puedes hacer con SPL, pero sigue siendo ridícula.

    – ircmaxell

    24 de septiembre de 2010 a las 11:07

avatar de usuario
marca panadero

$sum = 0;

function sumArray($item, $key, &$sum)
{
    if ($key == 'pv')
       $sum += $item;
}

array_walk_recursive($array, 'sumArray',&$sum);
echo $sum;

  • Funciona siempre que no haya nada más que matrices y números con la clave pv.

    – fredley

    23 de septiembre de 2010 a las 11:55

  • @fredley: si el OP tiene criterios adicionales (por ejemplo, prueba de booleanos, etc.), se pueden agregar fácilmente a la función de devolución de llamada sumArray

    – Marcos Baker

    23 de septiembre de 2010 a las 11:57

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad