valor - pasar variable string a int php
La forma más rápida de convertir una cadena a un entero en PHP (8)
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 se obtiene una entrada inesperada, como "hello"
o una matriz?
Acabo de configurar un ejercicio de evaluación comparativa rápida:
Function time to run 1 million iterations
--------------------------------------------
(int) "123": 0.55029
intval("123"): 1.0115 (183%)
(int) "0": 0.42461
intval("0"): 0.95683 (225%)
(int) int: 0.1502
intval(int): 0.65716 (438%)
(int) array("a", "b"): 0.91264
intval(array("a", "b")): 1.47681 (162%)
(int) "hello": 0.42208
intval("hello"): 0.93678 (222%)
En promedio, llamar a intval () es dos veces y media más lento, y la diferencia es la mayor si su entrada ya es un número entero.
Me interesaría saber por qué sin embargo.
Actualización: He ejecutado las pruebas nuevamente, esta vez con coerción (0 + $var)
| INPUT ($x) | (int) $x |intval($x) | 0 + $x |
|-----------------|------------|-----------|-----------|
| "123" | 0.51541 | 0.96924 | 0.33828 |
| "0" | 0.42723 | 0.97418 | 0.31353 |
| 123 | 0.15011 | 0.61690 | 0.15452 |
| array("a", "b") | 0.8893 | 1.45109 | err! |
| "hello" | 0.42618 | 0.88803 | 0.1691 |
|-----------------|------------|-----------|-----------|
Anexo: Acabo de encontrar un comportamiento ligeramente inesperado que debería tener en cuenta al elegir uno de estos métodos:
$x = "11";
(int) $x; // int(11)
intval($x); // int(11)
$x + 0; // int(11)
$x = "0x11";
(int) $x; // int(0)
intval($x); // int(0)
$x + 0; // int(17) !
$x = "011";
(int) $x; // int(11)
intval($x); // int(11)
$x + 0; // int(11) (not 9)
Probado utilizando PHP 5.3.1
Ejecutó un punto de referencia, y resulta que la forma más rápida de obtener un entero real (utilizando todos los métodos disponibles) es
$foo = (int)+"12.345";
Solo usando
$foo = +"12.345";
devuelve un flotador.
Ejecutar una prueba.
string coerce: 7.42296099663
string cast: 8.05654597282
string fail coerce: 7.14159703255
string fail cast: 7.87444186211
Esta fue una prueba que corrió cada escenario 10,000,000 veces. :-)
Co-ercion es 0 + "123"
El casting es (integer)"123"
Creo que Co-ercion es un poquito más rápido. Ah, y probar 0 + array(''123'')
es un error fatal en PHP. Es posible que desee que su código verifique el tipo del valor suministrado.
Mi código de prueba está abajo.
function test_string_coerce($s) {
return 0 + $s;
}
function test_string_cast($s) {
return (integer)$s;
}
$iter = 10000000;
print "-- running each text $iter times./n";
// string co-erce
$string_coerce = new Timer;
$string_coerce->Start();
print "String Coerce test/n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_coerce(''123'');
}
$string_coerce->Stop();
// string cast
$string_cast = new Timer;
$string_cast->Start();
print "String Cast test/n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_cast(''123'');
}
$string_cast->Stop();
// string co-erce fail.
$string_coerce_fail = new Timer;
$string_coerce_fail->Start();
print "String Coerce fail test/n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_coerce(''hello'');
}
$string_coerce_fail->Stop();
// string cast fail
$string_cast_fail = new Timer;
$string_cast_fail->Start();
print "String Cast fail test/n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_cast(''hello'');
}
$string_cast_fail->Stop();
// -----------------
print "/n";
print "string coerce: ".$string_coerce->Elapsed()."/n";
print "string cast: ".$string_cast->Elapsed()."/n";
print "string fail coerce: ".$string_coerce_fail->Elapsed()."/n";
print "string fail cast: ".$string_cast_fail->Elapsed()."/n";
class Timer {
var $ticking = null;
var $started_at = false;
var $elapsed = 0;
function Timer() {
$this->ticking = null;
}
function Start() {
$this->ticking = true;
$this->started_at = microtime(TRUE);
}
function Stop() {
if( $this->ticking )
$this->elapsed = microtime(TRUE) - $this->started_at;
$this->ticking = false;
}
function Elapsed() {
switch( $this->ticking ) {
case true: return "Still Running";
case false: return $this->elapsed;
case null: return "Not Started";
}
}
}
Más resultados de referencia ad-hoc:
$ time php -r ''for ($x = 0;$x < 999999999; $x++){$i = (integer) "-11";}''
real 2m10.397s
user 2m10.220s
sys 0m0.025s
$ time php -r ''for ($x = 0;$x < 999999999; $x++){$i += "-11";}''
real 2m1.724s
user 2m1.635s
sys 0m0.009s
$ time php -r ''for ($x = 0;$x < 999999999; $x++){$i = + "-11";}''
real 1m21.000s
user 1m20.964s
sys 0m0.007s
Personalmente siento que el casting es lo más bonito.
$iSomeVar = (int) $sSomeOtherVar;
En caso de que se envíe una cadena como ''Hola'', se convertirá en el entero 0. Para una cadena como ''22 años '', se convertirá en el entero 22. Cualquier cosa que no pueda analizar hasta un número se convierte en 0.
Si realmente NECESITA la velocidad, supongo que las otras sugerencias aquí son correctas al asumir que la coerción es la más rápida.
Simplemente puede convertir una cadena larga en un entero usando FLOAT
$float = (float)$num;
O si quieres un entero no flotante, entonces ve con
$float = (int)$num;
Por ej.
(int) "1212.3" = 1212
(float) "1212.3" = 1212.3
entero excracto de cualquier cadena
$ in = ''tel.123-12-33'';
preg_match_all(''!/d+!'', $in, $matches);
$out = (int)implode('''', $matches[0]);
// $ out = ''1231233'';
$int = settype("100", "integer"); //convert the numeric string to int