La respuesta de Guillermo no es suficientemente buena, ya que en algunos casos puede dar un warning, ya que
ctype_digit()
necesita una cadena. Si la invocas así:isIntegerOrStringWhithNumericCharacters(54.6)
te dará un warning.
Yo voy a dar otra respuesta que considero más válida:
Puedes comprobar si una variable en PHP es un entero o si tiene todos los caracteres numéricos utilizando varias funciones y métodos disponibles en el lenguaje. A menudo podrás usar una combinación de varios métodos para validar varias cosas a la vez.
La solución que me quedaría yo sería esta:
$variable = 42;
if (is_numeric($variable) && $variable == (int)$variable) {
echo 'La variable es un entero o contiene solo caracteres numéricos';
} else {
echo 'La variable no es un entero o no contiene solo caracteres numéricos';
}
Y en una función quedaría así:
function isIntegerOrStringWhithNumericCharacters($value) {
return (is_numeric($value) && $value == (int) $value) ? true : false;
}
En este caso, la función is_numeric()
verifica si la variable es numérica o una cadena numérica. Sin embargo, si le damos algo como 45.8
nos diría true
porque lo considera numérica y sin embargo no es entero.
Por eso luego le hacemos un casting a entero:
(int) $variable
Eso hará que se quiten los decimales, si es que los había. Luego verificamos si la variable es lo mismo que tenemos después de hacerle el casting a entero, en cuyo caso entendemos que ya era un entero.
Otras alternativas
-
Utilizando la función
is_int()
:Esta función devuelve
true
si la variable enviada por parámetro es un entero.$variable = 42; if (is_int($variable)) { echo 'La variable es un entero'; } else { echo 'La variable no es un entero'; }
Solo que no te dice si es una cadena numérica... si es cadena numérica te dirá que no es entero.
-
Utilizando la función
ctype_digit()
:Esta función verifica si todos los caracteres de la cadena enviada por parámetro son dígitos. Ten en cuenta que
ctype_digit
espera una cadena como parámetro, por lo que si tienes un número no irá bien y te mostrará un warning... aunque el mensaje que te da ahora en php 8 nos dice esto "Deprecated: ctype_digit(): Argument of type int will be interpreted as string" por lo que me deja con dudas. De todos modos, esta función podrías usarla después de que is_int() no te haya dicho que es un entero.$variable = '42'; if (ctype_digit($variable)) { echo 'La variable contiene solo caracteres numéricos'; } else { echo 'La variable no contiene solo caracteres numéricos'; }