solo - strlen php
¿Hay alguna diferencia entre is_int() y ctype_digit()? (7)
¿Se prefiere uno más o se desempeña mejor que el otro?
Lo último de lo que debería preocuparse es qué tan rápido es uno de estos. No hay manera de que revisar una cadena por ser un número entero sea un cuello de botella en tu código.
Si realmente no te importa si el argumento es un tipo int o una cadena con números, usa is_numeric. También volverá verdadero para los flotadores, aunque.
ctype no siempre devuelve falso en tipo entero.
foreach(range(-1000 , 1000)as $num){
if(ctype_digit($num)){
echo $num . ", ";
}
}
ctype_digit devuelve verdadero para el siguiente número de tipo entero.
-78, -77, -71,48,49,50,51,52,53,54,55,56,57,178,179,185, 256,257,258,259,260,261,262,263,264,265,266,267,268,269,270 a 1000
la práctica base es aplicar cada número a la cadena eq strval ($ num) o (String) $ num, en este caso el valor negativo (-78) siempre devolverá falso.
is_int le devolverá verdadero en el tipo de valor int entre -2147483647 a 2147483647. cualquier valor que exceda ese número le devuelve falso suponiendo que se está ejecutando en el sistema de 32 bits. en 64 bits puede ir hasta el rango de -9223372036854775807 a 9223372036854775807
en términos de rendimiento personalmente muy difícil de decir. ctype_digit tal vez más rápido que is_int, pero si tiene que convertir cada valor en el rendimiento de la cadena, se reduce en general.
Ctype_digit devuelve falso si el rango del entero está en rango negativo o entre 0 y 47 o entre 58 y 255. Puede verificar el comportamiento de ctype_digit utilizando el siguiente fragmento de código.
setlocale(LC_ALL, ''en_US.UTF-8'');
var_dump(
true === array_every(range(-1000, -1), ''ctype_digit_returns_false''),
true === array_every(range(0, 47), ''ctype_digit_returns_false''),
true === array_every(range(48, 57), ''ctype_digit_returns_true''),
true === array_every(range(58, 255), ''ctype_digit_returns_false''),
true === array_every(range(256, 1000), ''ctype_digit_returns_true'')
);
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/every
function array_every(array $array, $callable)
{
$count = count($array);
for ($i = 0; $i < $count; $i +=1) {
if (!$callable($array[$i])) {
return false;
}
}
return true;
}
function ctype_digit_returns_true($v)
{
return true === ctype_digit($v);
}
function ctype_digit_returns_false($v)
{
return false === ctype_digit($v);
}
is_int()
devuelve verdadero si el argumento es un tipo entero, ctype_digit()
toma un argumento de cadena y devuelve verdadero si todos los caracteres en la cadena son dígitos.
Ejemplo:
┌──────────┬───────────┬────────────────┐
│ │ is_int: │ ctype_digit: │
├──────────┼───────────┼────────────────┤
│ 123 │ true │ false │
├──────────┼───────────┼────────────────┤
│ 12.3 │ false │ false │
├──────────┼───────────┼────────────────┤
│ "123" │ false │ true │
├──────────┼───────────┼────────────────┤
│ "12.3" │ false │ false │
├──────────┼───────────┼────────────────┤
│ "-1" │ false │ false │
├──────────┼───────────┼────────────────┤
│ -1 │ true │ false │
└──────────┴───────────┴────────────────┘
También hay is_numeric
que devuelve verdadero si el valor pasado se puede analizar como número.
Si trato de comparar el rendimiento de las funciones en PHP 5.5.30 aquí están los resultados:
Este es el código que utilicé para el punto de referencia
// print table cell and highlight if lowest value is used
function wr($time1, $time2, $time3, $i) {
if($i == 1) $time = $time1;
if($i == 2) $time = $time2;
if($i == 3) $time = $time3;
echo(''<td>'');
if(min($time1, $time2, $time3) === $time) printf(''<b>%.4f</b>'', $time);
else printf(''%.4f'', $time);
echo(''</td>'');
}
$test_cases = array( 123, 12.3, ''123'', true);
$tests = 1000000;
$result = true; // Used just to make sure cycles won''t get optimized out
echo(''<table>''.PHP_EOL);
echo(''<tr><td> </td><th>is_int</th><th>ctype_digit</th><th>is_numeric</th></tr>'');
foreach($test_cases as $case) {
echo(''<tr><th>''.gettype($case).''</th>'');
$time = microtime(true);
for($i = 0; $i < $tests; $i++) {
$result |= is_int((int)rand());
}
$time1 = microtime(true)-$time;
$time = microtime(true);
for($i = 0; $i < $tests; $i++) {
$result |= ctype_digit((int)rand());
}
$time2 = microtime(true)-$time;
$time = microtime(true);
for($i = 0; $i < $tests; $i++) {
$result |= is_numeric((int)rand());
}
$time3 = microtime(true)-$time;
wr($time1, $time2, $time3, 1);
wr($time1, $time2, $time3, 2);
wr($time1, $time2, $time3, 3);
echo(''</tr>''.PHP_EOL);
}
echo(''</table>'');
exit();
Bueno, es muy interesante :) Aquí está toda la historia:
is_numeric:
encuentra si una variable es un número o una cadena numérica, ningún valor importante es negativo o booleano o cadena o cualquier tipo de número; si el valor es puramente numérico, devolverá''true''
o''false''
.Recuerde: Ningún número de solo carácter de ningún tipo :)
is_init
- Encuentra si el tipo de una variable es entero, si el valor es puramente entero, entonces devolverá ''verdadero'' en caso contrario ''falso''.Recuerde: Sin carácter, Doble o Negativo, Solo entero
in_integer
- Alias de is_int ()
intval:
- Obtiene el valor entero de una variable, toma todo tipo de valor y devuelve solo el valor entero, si los valores son negativos y luego devuelve el valor ''-Integer
''. Los valores sin importancia son Integer, Float, Negative o ''NumberString
'' o ''NumberStringCharacter
''. Es restar los valores enteros de la cadena "If String Starts with Number
".
- NumberString = Un valor de número en formato de cadena
- NumberStringCharacter = A String Start con Number
Recuerde: Obtendrá el valor entero de Number, Float, Negative o String que comienza con Number.
ctype_digit
- Verifique los caracteres numéricos, si se proporciona un número entero en formato de cadena, obtendrá ''true
'' o ''false
''. Funcionará con StringNumber, No Float, No Negative only Whole Number como String.Recuerde: Número entero como cadena, número negativo, número de flotante, tipo de número, carácter, número único como cadena.
Vista panorámica:
Gracias a http://php.net/