Prüfen, ob eine Variable in PHP eine Ganzzahl ist

Lesezeit: 10 Minuten

Ich habe folgenden Code

    $page = $_GET['p'];

    if($page == "")
    {
        $page = 1;
    }
    if(is_int($page) == false)
    {
        setcookie("error", "Invalid page.", time()+3600);
        header("location:somethingwentwrong.php");
        die();
    }
    //else continue with code

die ich zum Betrachten verschiedener “Seiten” einer Datenbank verwenden werde (Ergebnisse 1-10, 11-20 usw.). Ich kann die Funktion is_int() jedoch nicht richtig zum Laufen bringen. Das Einfügen von “1” in die URL (noobs.php?p=1) gibt mir den Fehler “Ungültige Seite” sowie so etwas wie “asdf”.

Prufen ob eine Variable in PHP eine Ganzzahl ist
Kamera CHN

Verwenden is_numeric() zu prüfen, ob eine Variable eine ganze Zahl ist, ist eine schlechte Idee. Diese Funktion kehrt zurück TRUE zum 3.14 zum Beispiel. Es ist nicht das erwartete Verhalten.

Um dies korrekt zu tun, können Sie eine dieser Optionen verwenden:

Unter Berücksichtigung dieses Variablen-Arrays:

$variables = [
    "TEST 0" => 0,
    "TEST 1" => 42,
    "TEST 2" => 4.2,
    "TEST 3" => .42,
    "TEST 4" => 42.,
    "TEST 5" => "42",
    "TEST 6" => "a42",
    "TEST 7" => "42a",
    "TEST 8" => 0x24,
    "TEST 9" => 1337e0
];

Die erste Option (Weg FILTER_VALIDATE_INT):

# Check if your variable is an integer
if ( filter_var($variable, FILTER_VALIDATE_INT) === false ) {
  echo "Your variable is not an integer";
}

Ausgabe :

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

Die zweite Option (CASTING COMPARISON way):

# Check if your variable is an integer
if ( strval($variable) !== strval(intval($variable)) ) {
  echo "Your variable is not an integer";
}

Ausgabe :

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

Die dritte Option (CTYPE_DIGIT-Weg):

# Check if your variable is an integer
if ( ! ctype_digit(strval($variable)) ) {
  echo "Your variable is not an integer";
}

Ausgabe :

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

Die vierte Option (REGEX-Weg):

# Check if your variable is an integer
if ( ! preg_match('/^\d+$/', $variable) ) {
  echo "Your variable is not an integer";
}

Ausgabe :

TEST 0 : 0 (type:integer) is an integer ✔
TEST 1 : 42 (type:integer) is an integer ✔
TEST 2 : 4.2 (type:double) is not an integer ✘
TEST 3 : 0.42 (type:double) is not an integer ✘
TEST 4 : 42 (type:double) is an integer ✔
TEST 5 : 42 (type:string) is an integer ✔
TEST 6 : a42 (type:string) is not an integer ✘
TEST 7 : 42a (type:string) is not an integer ✘
TEST 8 : 36 (type:integer) is an integer ✔
TEST 9 : 1337 (type:double) is an integer ✔

  • Achten Sie auf FILTER_VALIDATE_INT (Ihr bevorzugter Weg) 0 gibt falsch zurück!

    – Niksac

    27. Juli 2015 um 14:39 Uhr

  • Verwenden Sie stattdessen filter_var($int, FILTER_VALIDATE_INT) !== false.

    – Niksac

    27. Juli 2015 um 15:15 Uhr

  • Ich denke, es gibt eine! fehlt bei if(filter_var($variable, FILTER_VALIDATE_INT) !== false) echo "its not an integer ,rechts?

    – Adam

    28. Juni 2016 um 9:36 Uhr

  • oder der Text sollte in “it is an iteger” geändert werden

    – Adam

    28. Juni 2016 um 9:37 Uhr

  • Der ‘CTYPE_DIGIT-Weg’ und der ‘REGEX-Weg’ schlagen beide für negative Ganzzahlen fehl. Der ‘REGEX-Weg’ kann behoben werden, indem überprüft wird, ob ein führendes negatives Vorzeichen vorhanden ist (-?), aber das glaube ich nicht ctype_digit kann auf prägnante Weise verwendet werden, um nach negativen ganzen Zahlen zu suchen. Außerdem kann der gepostete Code nicht die entsprechenden Ausgaben erzeugen.

    – David F

    13. Juli 2018 um 1:25 Uhr


Alle $_GET Parameter haben einen String-Datentyp, daher is_int wird immer false zurückgeben.

Sie können dies sehen, indem Sie anrufen var_dump:

var_dump($_GET['p']); // string(2) "54"

Verwenden is_numeric liefert das gewünschte Ergebnis (wohlgemerkt, das erlaubt Werte wie: 0x24).

  • Warnung: Dies wird für mehr als nur ints true zurückgeben, verwenden Sie eine der anderen Lösungen unten.

    – Nathan Bell

    20. August 2015 um 0:50 Uhr

Wenn der Browser sendet p in der Abfragezeichenfolge wird es als Zeichenfolge empfangen, nicht als Int. is_int() wird daher immer false zurückgeben.

Versuchen Sie es stattdessen is_numeric() oder ctype_digit()

Nur zum Spaß habe ich einige der genannten Methoden getestet, plus eine, die ich seit Jahren als Lösung verwende, 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 übergeben hat.

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 die Regex nicht einmal getestet, ich meine, ernsthaft … Regex dafür?)

Dinge zu beachten:

Methode 4 gibt für negative Zahlen immer „false“ zurück (negative Ganzzahl oder String-Äquivalent) und ist daher 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, aber false für eine Zeichenfolge, die einer negativen Ganzzahl entspricht. Verwenden Sie diese Methode also nur, wenn Sie sicher sind, dass Ihre Eingabe niemals eine negative Zahl in Zeichenfolgen- oder Ganzzahlform enthalten wird, und wenn dies der Fall ist , wird Ihr Prozess dieses Verhalten nicht unterbrechen.

Schlussfolgerungen

Wenn Sie also sicher sind, dass Ihre Eingabe keine negative Zahl enthält, ist die Verwendung fast doppelt so schnell is_int und ctype_digit um zu bestätigen, dass Sie eine Ganzzahl haben. 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ächstschnellere Methode (insbesondere, wenn ein Großteil der Eingabe aus tatsächlichen ganzen Zahlen oder positiven Zahlen in einer Zeichenfolge besteht). Alles in allem, wenn Sie eine solide Konsistenz benötigen und keine Ahnung haben, welche Mischung von Daten hereinkommt, und Sie auf konsistente Weise mit Negativen umgehen müssen, filter_var($value, FILTER_VALIDATE_INT) !== FALSE Gewinnt.

Code, der verwendet wird, um die obige Ausgabe zu erhalten:

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

Prufen ob eine Variable in PHP eine Ganzzahl ist
job3dot5

/!\ Beste Antwort ist nicht korrekt, is_numeric() gibt true für ganze Zahlen UND alle numerischen Formen wie “9.1” zurück

Nur für Integer können Sie das unfreundliche preg_match(‘/^\d+$/’, $var) oder den expliziten und 2-mal schnelleren Vergleich verwenden:

if ((int) $var == $var) {
    // $var is an integer
}

PS: Ich weiß, dass dies ein alter Beitrag ist, aber immer noch der dritte in Google, der nach “php is integer” sucht

  • Das ist falsch, weil diese Bedingung auch dann erfüllt ist, wenn zB $var=”9″. Es sollte if ((int) $var === $var) sein. $a == $b Gleich TRUE, wenn $a gleich $b nach Typ-Jonglage ist. $a === $b Identisch WAHR, wenn $a gleich $b ist und sie vom gleichen Typ sind.

    – valerij wasilcenko

    17. April 2015 um 10:46 Uhr

  • beachte das (int) $var gibt Null zurück, wenn die Zeichenfolge nicht in eine Zahl umgewandelt werden kann, also: (int) 'banana' === 0

    – Ignacio Segura

    31. Oktober 2016 um 9:21 Uhr

  • Abgestimmt, da Kommentare zeigen, dass diese Antwort nicht richtig ist.

    – EAmez

    7. Februar 2020 um 9:01 Uhr

  • @IgnacioSegura, also ist es sicher, wenn es nach einem Validator wie verwendet wird if (is_numeric($var) && ((int) $var == $var)) {...}?

    – Guney Ozsan

    23. Mai 2020 um 13:01 Uhr

  • @GuneyOzsan, was Sie vorschlagen, klingt richtig, aber um ehrlich zu sein, habe ich vor zwei Jahren aufgehört, in PHP zu programmieren, und ich habe eine Menge Dinge vergessen. Tut mir leid, dass ich nicht hilfreicher sein könnte.

    – Ignacio Segura

    24. Mai 2020 um 15:14 Uhr

1645926848 575 Prufen ob eine Variable in PHP eine Ganzzahl ist
Aleksandr

Die Lösung von Doctormad ist nicht korrekt. Versuche dies:

$var="1a";
if ((int) $var == $var) {
    var_dump("$var is an integer, really?");
}

das druckt

1a ist wirklich eine ganze Zahl?”

verwenden filter_var() mit FILTER_VALIDATE_INT Streit

$data = Array('0', '1', '1a', '1.1', '1e', '0x24', PHP_INT_MAX+1);
array_walk($data, function ($num){
$is_int = filter_var($num, FILTER_VALIDATE_INT);
if ($is_int === false)
var_dump("$num is not int");
});

das druckt

1a is not int 
1.1 is not int
1e is not int
0x24 is not int
9.2233720368548E+18 is not int

  • Das ist falsch, weil diese Bedingung auch dann erfüllt ist, wenn zB $var=”9″. Es sollte if ((int) $var === $var) sein. $a == $b Gleich TRUE, wenn $a gleich $b nach Typ-Jonglage ist. $a === $b Identisch WAHR, wenn $a gleich $b ist und sie vom gleichen Typ sind.

    – valerij wasilcenko

    17. April 2015 um 10:46 Uhr

  • beachte das (int) $var gibt Null zurück, wenn die Zeichenfolge nicht in eine Zahl umgewandelt werden kann, also: (int) 'banana' === 0

    – Ignacio Segura

    31. Oktober 2016 um 9:21 Uhr

  • Abgestimmt, da Kommentare zeigen, dass diese Antwort nicht richtig ist.

    – EAmez

    7. Februar 2020 um 9:01 Uhr

  • @IgnacioSegura, also ist es sicher, wenn es nach einem Validator wie verwendet wird if (is_numeric($var) && ((int) $var == $var)) {...}?

    – Guney Ozsan

    23. Mai 2020 um 13:01 Uhr

  • @GuneyOzsan, was Sie vorschlagen, klingt richtig, aber um ehrlich zu sein, habe ich vor zwei Jahren aufgehört, in PHP zu programmieren, und ich habe eine Menge Dinge vergessen. Tut mir leid, dass ich nicht hilfreicher sein könnte.

    – Ignacio Segura

    24. Mai 2020 um 15:14 Uhr

Prufen ob eine Variable in PHP eine Ganzzahl ist
phihag

Werte $_GET sind immer Strings – das sind GET-Parameter. Deswegen, is_int($_GET[...]) ist immer falsch.

Mit können Sie testen, ob ein String nur aus Ziffern besteht (also als Zahl interpretiert werden könnte). ist_numerisch.

870700cookie-checkPrüfen, ob eine Variable in PHP eine Ganzzahl ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy