Cita:
Iniciado por Vanessita
Hola a todos,
Quisiera que por favor me ayudaran a entender qué hace realmente la siguiente función en PHP, ya que me salió e un examen y no supe qué responder:
Código PHP:
public static function is_valid($str)
{
if (!ctype_digit($str)) return FALSE;
$len = strlen($str);
if ($len != 15) return FALSE;
$odd = !strlen($str)%2;
$sum = 0;
for ($i=0; $i<$len; ++$i) {
$n = 0 + $str[$i];
$odd = !odd;
if ($odd) {
$sum += $n;
} else {
$x=2*$n;
$sum += $x>9?$x-9:$x;
}
}
return (($sum%10)==0);
}
Muchas gracias por su tiempo.
Esta funcion tiene código que no es necesario, para forzar a que se esté atento a lo que hace.
Si la longitud no es 15, la segunda línea no se ejecutará.Así que la segunda linea es equivalente a $odd=!15%2, que equivale a $odd=!1.En definitiva, $odd=0
Ahora, el bucle:
Código PHP:
Ver originalfor ($i=0; $i<$len; ++$i) {
$n = 0 + $str[$i];
$odd = !odd;
if ($odd) {
$sum += $n;
} else {
$x=2*$n;
$sum += $x>9?$x-9:$x;
}
}
A $n se le asigna el valor entero del caracter $i.Al ser 1 solo carácter, su valor sólo puede ser entre 0 y 9.Por lo tanto, la condicion $x>9 nunca se va a cumplir.Esto hace que el bucle quede en:
Código PHP:
Ver originalfor ($i=0; $i<$len; ++$i) {
$n = 0 + $str[$i];
$odd = !odd;
if ($odd) {
$sum += $n;
} else {
$x=2*$n;
$sum += $x;
}
}
Hay que tener en cuenta que $odd se inicializó a 0.En la primera iteración del blucle, $i = 0, pero $odd= !$odd, con lo que $odd pasa a ser 1.
Asi que, $sum es la suma de los numeros colocados en una posicion par, más el doble de la suma de los numeros colocados en una posicion impar. (Las posiciones se cuentan de izquierda a derecha).
La función retorna true si $sum es múltiplo de 10.