Obtenga la suma de todos los dígitos en una cadena numérica

3 minutos de lectura

avatar de usuario
Leticia Meyere

¿Cómo encuentro la suma de todos los dígitos en un número en PHP?

array_sum(str_split($number));

Esto supone que el número es positivo (o, más exactamente, que la conversión de $number en una cadena genera solo dígitos).

  • ¡Gracias! ¡Cuanto más simple, mejor! Si no sabe si un número es positivo o negativo, puede usar la función abs() para que sea siempre positivo array_sum(str_split(abs($number)));

    – imelgrat

    21/09/2016 a las 15:52

  • Es curioso cómo esto obtuvo más de 70 votos aquí y en la página del manual de php es rechazado por -40 mira aquí

    – Manuel Manhardt

    7 de marzo de 2018 a las 13:06

  • No solo es más corto que cualquier bucle, sino también más rápido: PHP no tiene división de enteros, por lo que una solución de bucle debe convertir el número restante de float a int en cada iteración.

    – Tito

    4 mayo 2018 a las 15:48

avatar de usuario
nikic

El método Artefactos es obviamente imbatible, pero aquí hay una versión de cómo se podría hacer “manualmente”:

$number = 1234567890;
$sum = 0;
do {
    $sum += $number % 10;
}
while ($number = (int) ($number / 10));

Esto es en realidad más rápido que el método Artefactos (al menos para 1234567890), porque guarda dos llamadas de función.

  • ¿Qué sucede si $número = “12345678901234567890”;?

    – Shaiful Islam

    1 de febrero de 2015 a las 19:11

  • @ShaifulIslam, ¿qué pasa con eso?

    – Adán

    15 mayo 2020 a las 10:36

  • Se hizo una pregunta duplicada porque esta respuesta no tiene explicación.

    – mickmackusa

    8 ago a las 0:43

Otra forma, no tan rápida, no de una sola línea simple

<?php

    $n = 123;
    $nstr = $n . "";

    $sum = 0;
    for ($i = 0; $i < strlen($nstr); ++$i)
    {
        $sum += $nstr[$i];
    }
    echo $sum;

?>

También asume que el número es positivo.

  • @Frank Farmer Efficiency no estaría calculando la longitud de la cadena en cada iteración: P

    – Alex

    22 de diciembre de 2010 a las 4:24

  • Cierto, pero eso es probablemente mejor que construir una matriz completa a través de str_split.

    – Frank Granjero

    12 de enero de 2011 a las 2:16

avatar de usuario
Aries

function addDigits($num) {

    if ($num % 9 == 0 && $num > 0) {
        return 9;
    } else {
          return $num % 9;
        }
    }

sólo en)

en el resultado del envío de LeetCode: Tiempo de ejecución: 4 ms, más rápido que el 92,86 % de los envíos en línea de PHP para Agregar dígitos. Uso de memoria: 14,3 MB, menos del 100,00 % de los envíos en línea de PHP para Agregar dígitos.

<?php 
// PHP program to calculate the sum of digits 
function sum($num) { 
    $sum = 0; 
    for ($i = 0; $i < strlen($num); $i++){ 
        $sum += $num[$i]; 
    } 
    return $sum; 
} 

// Driver Code 
$num = "925"; 
echo sum($num); 
?> 

El resultado será 9+2+5 = 16

  • ¡Hola! Si bien este código puede resolver la pregunta, incluyendo una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación y probablemente resulte en más votos a favor. Recuerde que está respondiendo la pregunta para lectores en el futuro, no solo para la persona que pregunta ahora. Edite su respuesta para agregar explicaciones y dar una indicación de las limitaciones y suposiciones que se aplican.

    – Brian

    21 de abril de 2020 a las 0:39

avatar de usuario
kenorb

Prueba el siguiente código:

<?php

$num = 525;
$sum = 0;

while ($num > 0)
{
    $sum= $sum + ($num % 10);
    $num= $num / 10;
}
echo "Summation=" . $sum;

?>

  • ¡Hola! Si bien este código puede resolver la pregunta, incluyendo una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación y probablemente resulte en más votos a favor. Recuerde que está respondiendo la pregunta para lectores en el futuro, no solo para la persona que pregunta ahora. Edite su respuesta para agregar explicaciones y dar una indicación de las limitaciones y suposiciones que se aplican.

    – Brian

    21 de abril de 2020 a las 0:39

avatar de usuario
es azzad

Si está interesado con expresiones regulares:

array_sum(preg_split("//", $number));

¿Ha sido útil esta solución?