Usando PHP, ¿cuál es la forma más rápida de convertir una cadena como esta: "123"
a un entero?
¿Por qué ese método en particular es el más rápido? ¿Qué sucede si recibe una entrada inesperada, como "hello"
o una matriz?
php
optimization
casting
nickf
fuente
fuente
(int)
yintval()
puede ser superior al 400%!Respuestas:
Acabo de configurar un ejercicio rápido de evaluación comparativa:
En promedio, llamar a intval () es dos veces y media más lento, y la diferencia es mayor si su entrada ya es un número entero.
Sin embargo, me interesaría saber por qué .
Actualización: he vuelto a ejecutar las pruebas, esta vez con coerción
(0 + $var)
Anexo: Acabo de encontrar un comportamiento ligeramente inesperado que debe tener en cuenta al elegir uno de estos métodos:
Probado con PHP 5.3.1
fuente
+"15" == 15
(int)
yintval
, y en cada par, da un% enintval
, el caso base debe ser(int)
. Pero tiene un buen punto de que habría sido más claro si lo hubiera dicho explícitamente, ¡especialmente porque más tarde agregó un tercer caso!Personalmente siento que el casting es el más bonito.
Si se envía una cadena como 'Hola', se convertirá al entero 0. Para una cadena como '22 años ', se convertirá al entero 22. Cualquier cosa que no se pueda analizar a un número se convierte en 0.
Si realmente NECESITA la velocidad, supongo que las otras sugerencias aquí son correctas al suponer que la coerción es la más rápida.
fuente
Haz una prueba.
Esta fue una prueba que ejecutó cada escenario 10,000,000 de veces. :-)
Co-ercion es
0 + "123"
El casting es
(integer)"123"
Creo que Coerción es un poco más rápido. Ah, e intentarlo
0 + array('123')
es un error fatal en PHP. Es posible que desee que su código verifique el tipo del valor proporcionado.Mi código de prueba está abajo.
fuente
settype
esta prueba y la ejecuté usando PHP 7. Cast salió un poco adelante y una gran mejora en el rendimiento en general: string coerce: 1.9255340099335 string cast: 1.5142338275909 string settype: 4.149735212326 string fail coerce: 1.2346560955048 string fail cast: 1.3967711925507 string fail settype: 4.149735212326Simplemente puede convertir una cadena larga en un entero utilizando FLOAT
$float = (float)$num;
O si quieres un entero no flotante, entonces ve con
$float = (int)$num;
Por ej.
fuente
(int)
? Puede ser cierto que si la cadena contiene un número entero,(float)
devolverá un valor que se parece mucho a un número entero (aunque su tipo interno sea probablementefloat
), pero ¿por qué haría esto si la especificación es devolver un valor entero? ? Supongamos que la cadena entrante es "1.3"? No obtendrás un número entero. Además, por el bien de cualquiera que lea el código en el futuro, debe decir lo que quiere decir. Si quiere decir "debería ser un número entero", entonces diga que(int)
no(float)
.fuente
entero excract de cualquier cadena
$ in = 'tel.123-12-33';
// $ out = '1231233';
fuente
Más resultados de referencia ad-hoc:
fuente
{ $i = +"-11"; $i = +"-11"; $i= +"-11"; $i= +"-11"; ... }
. También es arriesgado usar el valor literal"-11"
directamente, a menos que esté seguro de que el lenguaje no hará parte del trabajo en el momento de la compilación. Probablemente esté bien para un lenguaje dinámico como PHP, pero menciono para referencia futura si prueba fórmulas en otros idiomas. Es más seguro establecer una variable$x = "-11"
antes del bucle de prueba y luego usarla. De modo que el código interno es$i =+$x
.Ejecutó un punto de referencia, y resulta que la forma más rápida de obtener un número entero real (usando todos los métodos disponibles) es
Solo usando
devuelve un flotador
fuente
(int)"12.345"
? ¿Más rápido en qué porcentaje?