250 votes

La façon la plus rapide pour convertir la chaîne en entier en PHP

À l'aide de PHP, ce qui est le moyen le plus rapide pour convertir une chaîne de caractères comme ceci: "123" d'un entier?

Pourquoi est-ce la méthode la plus rapide? Qu'advient-il si il fait inattendu d'entrée, comme "hello" ou un tableau?

369voto

nickf Points 185423

Je viens de mettre en place rapidement un exercice d'analyse comparative:

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 moyenne, appelant intval() est deux fois et demi plus lent, et la différence est la plus grande si votre entrée est déjà un entier.

Je serais curieux de savoir pourquoi .


Mise à jour: j'ai exécuter les tests, cette fois avec la coercition (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   |
|-----------------|------------|-----------|-----------|

Addendum: je viens de trouver un peu inattendu comportement que vous devez être conscient au moment de choisir l'une de ces méthodes:

$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)

Testé à l'aide de PHP 5.3.1

34voto

Rexxars Points 636

Personnellement, je pense que le casting est la plus jolie.

$iSomeVar = (int) $sSomeOtherVar;

Si une chaîne de caractères comme "Bonjour" être envoyé, il sera jeté à l'entier 0. Pour une chaîne telle que "22 ans", elle sera convertie en entier 22. Tout ce qu'il ne peut pas analyser un certain nombre devient 0.

Si vous avez vraiment BESOIN de la vitesse, je suppose que les autres suggestions ici sont correct en supposant que la contrainte est la plus rapide.

15voto

staticsan Points 14435

L'exécution d'un test.

   string coerce:          7.42296099663
   string cast:            8.05654597282
   string fail coerce:     7.14159703255
   string fail cast:       7.87444186211

C'était un test exécuté chaque scénario de 10 000 000 de fois. :-)

La contrainte est - 0 + "123"

Le Casting est (integer)"123"

Je pense que la Contrainte est un tout petit peu plus rapide. Oh, et en essayant 0 + array('123') est une erreur fatale en PHP. Vous pourriez voulez que votre code pour vérifier le type de la valeur fournie.

Mon test de code est ci-dessous.


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";
        }
    }
}

7voto

Elric Wamugu Points 78
$int = settype("100", "integer"); //convert the numeric string to int

7voto

Grek Hmhmm Points 107

entier excract à partir de n'importe quelle chaîne

$ = 'tél.123-12-33';

preg_match_all('!\d+!', $in, $matches);
$out =  (int)implode('', $matches[0]);

//$out ='1231233';

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X