Nur zum Spaß habe ich einige der genannten Methoden getestet und eine, die ich jahrelang als Lösung verwendet habe, wenn ich weiß, dass meine Eingabe eine positive Zahl oder ein String-Äquivalent ist.
Ich habe dies mit 125.000 Iterationen getestet, wobei jede Iteration denselben Satz von Variablentypen und -werten durchlief.
Methode 1: is_int($value) || ctype_digit($value)
Methode 2: (string)(int)$value == (string)$value
Methode 3: strval(intval($value)) === strval($value)
Methode 4: ctype_digit(strval($value))
Methode 5: filter_var($value, FILTER_VALIDATE_INT) !== FALSE
Methode 6: is_int($value) || ctype_digit($value) || (is_string($value) && $value[0] === '-' && filter_var($value, FILTER_VALIDATE_INT) !== FALSE)
Methode 1: 0,0552167892456
Methode 2: 0,126773834229
Methode 3: 0,143012046814
Methode 4: 0,0979189872742
Methode 5: 0,112988948822
Methode 6: 0,0858821868896
(Ich habe nicht einmal die Regex getestet, ich meine, ernsthaft ... Regex dafür?)
Zu beachtende Punkte:
Methode 4 gibt für negative Zahlen (negative Ganzzahl oder Zeichenfolgenäquivalent) immer false zurück. Dies ist eine gute Methode, um konsistent zu erkennen, dass ein Wert eine positive Ganzzahl ist.
Methode 1 gibt true für eine negative Ganzzahl zurück, false jedoch für eine Zeichenfolge, die einer negativen Ganzzahl entspricht. Verwenden Sie diese Methode daher nur, wenn Sie sicher sind, dass Ihre Eingabe niemals eine negative Zahl in Zeichenfolgen- oder Ganzzahlform enthält Ihr Prozess wird von diesem Verhalten nicht unterbrochen.
Schlussfolgerungen
Wenn Sie also sicher sind, dass Ihre Eingabe keine negative Zahl enthält, ist es fast doppelt so schnell, eine Ganzzahl zu verwenden is_intund ctype_digitzu überprüfen. Die Verwendung von Methode 1 mit einem Fallback auf Methode 5, wenn die Variable eine Zeichenfolge und das erste Zeichen ein Bindestrich ist, ist die nächstschnellste (insbesondere, wenn ein Großteil der Eingabe tatsächliche Ganzzahlen oder positive Zahlen in einer Zeichenfolge sind). Alles in allem filter_var($value, FILTER_VALIDATE_INT) !== FALSEgewinnt es , wenn Sie eine solide Konsistenz benötigen und keine Ahnung haben, wie der Datenmix hereinkommt, und wenn Sie mit Negativen konsistent umgehen müssen, gewinnt dies.
Code zum Abrufen der obigen Ausgabe:
$u = "-10";
$v = "0";
$w = 0;
$x = "5";
$y = "5c";
$z = 1.44;
function is_int1($value){
return (is_int($value) || ctype_digit($value));
}
function is_int2($value) {
return ((string)(int)$value == (string)$value);
}
function is_int3($value) {
return (strval(intval($value)) === strval($value));
}
function is_int4($value) {
return (ctype_digit(strval($value)));
}
function is_int5($value) {
return filter_var($value, FILTER_VALIDATE_INT) !== FALSE;
}
function is_int6($value){
return (is_int($value) || ctype_digit($value) || (is_string($value) && $value[0] === '-' && filter_var($value, FILTER_VALIDATE_INT)) !== FALSE);
}
$start = microtime(TRUE);
for ($i=0; $i < 125000; $i++) {
is_int1($u);
is_int1($v);
is_int1($w);
is_int1($x);
is_int1($y);
is_int1($z);
}
$stop = microtime(TRUE);
$start2 = microtime(TRUE);
for ($j=0; $j < 125000; $j++) {
is_int2($u);
is_int2($v);
is_int2($w);
is_int2($x);
is_int2($y);
is_int2($z);
}
$stop2 = microtime(TRUE);
$start3 = microtime(TRUE);
for ($k=0; $k < 125000; $k++) {
is_int3($u);
is_int3($v);
is_int3($w);
is_int3($x);
is_int3($y);
is_int3($z);
}
$stop3 = microtime(TRUE);
$start4 = microtime(TRUE);
for ($l=0; $l < 125000; $l++) {
is_int4($u);
is_int4($v);
is_int4($w);
is_int4($x);
is_int4($y);
is_int4($z);
}
$stop4 = microtime(TRUE);
$start5 = microtime(TRUE);
for ($m=0; $m < 125000; $m++) {
is_int5($u);
is_int5($v);
is_int5($w);
is_int5($x);
is_int5($y);
is_int5($z);
}
$stop5 = microtime(TRUE);
$start6 = microtime(TRUE);
for ($n=0; $n < 125000; $n++) {
is_int6($u);
is_int6($v);
is_int6($w);
is_int6($x);
is_int6($y);
is_int6($z);
}
$stop6 = microtime(TRUE);
$time = $stop - $start;
$time2 = $stop2 - $start2;
$time3 = $stop3 - $start3;
$time4 = $stop4 - $start4;
$time5 = $stop5 - $start5;
$time6 = $stop6 - $start6;
print "**Method 1:** $time <br>";
print "**Method 2:** $time2 <br>";
print "**Method 3:** $time3 <br>";
print "**Method 4:** $time4 <br>";
print "**Method 5:** $time5 <br>";
print "**Method 6:** $time6 <br>";