it-swarm.com.de

Der schnellste Weg, um einen String in eine Ganzzahl umzuwandeln in PHP

Was ist der schnellste Weg, mit PHP einen String wie diesen zu konvertieren: "123" zu einer ganzen Zahl?

Warum ist diese Methode die schnellste? Was passiert, wenn unerwartete Eingaben wie "hello" oder ein Array?

247
nickf

Ich habe gerade eine kurze Benchmarking-Übung erstellt:

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

Im Durchschnitt ist der Aufruf von intval () zweieinhalb Mal langsamer, und der Unterschied ist am größten, wenn Ihre Eingabe bereits eine Ganzzahl ist.

Ich würde gerne wissen warum .


Update: Ich habe die Tests erneut ausgeführt, diesmal mit Zwang (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   |
|-----------------|------------|-----------|-----------|

Nachtrag: Ich habe gerade ein etwas unerwartetes Verhalten festgestellt, das Sie bei der Auswahl einer der folgenden Methoden berücksichtigen sollten:

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

Getestet mit PHP 5.3.1

369
nickf

Ich persönlich halte das Casting für das Schönste.

$iSomeVar = (int) $sSomeOtherVar;

Wird eine Zeichenfolge wie 'Hallo' gesendet, wird sie in Ganzzahl 0 umgewandelt. Bei einer Zeichenfolge wie '22 Jahre alt 'wird sie in Ganzzahl 22 umgewandelt. Alles, was nicht mit einer Zahl analysiert werden kann, wird zu 0.

Wenn Sie wirklich die Geschwindigkeit BENÖTIGEN, sind die anderen Vorschläge hier vermutlich richtig, wenn Sie davon ausgehen, dass der Zwang am schnellsten ist.

34
Rexxars

Führen Sie einen Test durch.

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

Dies war ein Test, bei dem jedes Szenario 10.000.000 Mal ausgeführt wurde. :-)

Co-ercion ist 0 + "123"

Casting ist (integer)"123"

Ich denke, Co-ercion ist ein bisschen schneller. Oh, und 0 + array('123') ist ein schwerwiegender Fehler in PHP. Möglicherweise möchten Sie, dass Ihr Code den Typ des angegebenen Werts überprüft.

Mein Testcode ist unten.


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

Sie können einen langen String einfach mit FLOAT in eine Ganzzahl konvertieren

$float = (float)$num;

Oder wenn Sie wollen, dass eine Ganzzahl nicht schwebt, dann gehen Sie mit

$float = (int)$num;

Zum Beispiel.

(int)   "1212.3"   = 1212 
(float) "1212.3"   = 1212.3
9
$int = settype("100", "integer"); //convert the numeric string to int
7
Elric Wamugu

ganzzahl, die aus einer beliebigen Zeichenfolge extrahiert wird

$ in = 'tel.123-12-33';

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

// $ out = '1231233';

7
Developer

Weitere Ad-hoc-Benchmark-Ergebnisse:

$ 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
4
Daniel

Lief einen Benchmark, und es stellt sich heraus, dass der schnellste Weg zum Erhalten einer real Ganzzahl (unter Verwendung aller verfügbaren Methoden) ist

$foo = (int)+"12.345";

Nur mit

$foo = +"12.345";

gibt einen float zurück.

4
Andrew Plank