webentwicklung-frage-antwort-db.com.de

Bester Weg, um positive ganze Zahl (PHP) zu überprüfen?

Ich muss prüfen, ob ein Formulareingabewert eine positive ganze Zahl ist (nicht nur eine ganze Zahl), und mir ist ein weiterer Ausschnitt mit dem folgenden Code aufgefallen:

$i = $user_input_value;
if (!is_numeric($i) || $i < 1 || $i != round($i)) {
  return TRUE;
}

Ich habe mich gefragt, ob es von Vorteil ist, die drei oben genannten Überprüfungen zu verwenden, anstatt nur etwas zu tun:

$i = $user_input_value;
if (!is_int($i) && $i < 1) {
  return TRUE;
}
36
geerlingguy

der Unterschied zwischen den beiden Codeausschnitten besteht darin, dass is_numeric($i) auch true zurückgibt, wenn $ i eine numerische Zeichenfolge ist. is_int($i) gibt jedoch nur true zurück, wenn $ i eine Ganzzahl ist, und nicht, wenn $ i eine Integer-Zeichenfolge ist. Deshalb sollten Sie das erste Code-Snippet verwenden, wenn Sie auch true zurückgeben möchten, wenn $ i eine Integer-Zeichenfolge ist (z. B. wenn $ i == "19" und nicht $ i == 19).

Weitere Informationen finden Sie in diesen Referenzen:

PHP is_numeric Funktion

PHP is_int Funktion

31
Sören

Nicht sicher, warum es keinen Vorschlag gibt, filter_var zu verwenden. Ich weiß, es ist ein alter Thread, aber vielleicht hilft es jemandem raus (immerhin bin ich hier gelandet, oder?).

$filter_options = array( 
    'options' => array( 'min_range' => 0) 
);


if( filter_var( $i, FILTER_VALIDATE_INT, $filter_options ) !== FALSE) {
   ...
}

Sie können auch einen Maximalwert hinzufügen.

$filter_options = array(
    'options' => array( 'min_range' => 0,
                        'max_range' => 100 )
);

http://php.net/manual/de/function.filter-var.php

http://www.php.net/manual/de/filter.filters.validate.php

31
Jeffrey Vdovjak

Die beste Methode zum Prüfen auf positive Ganzzahlen, wenn die Variable INTEGER oder STRING sein kann, die die Ganzzahl darstellt:

 if ((is_int($value) || ctype_digit($value)) && (int)$value > 0 ) { // int }

is_int() gibt true zurück, wenn der Werttyp integer ist. ctype_digit() gibt true zurück, wenn der Typ string ist, der Wert der Zeichenfolge jedoch eine ganze Zahl ist.

Der Unterschied zwischen dieser Prüfung und is_numeric() besteht darin, dass is_numeric() selbst für die Werte, die Zahlen sind, die keine Ganzzahlen sind (z. B. "+0.123"), true zurückgibt.

14
Christian P

Es geht definitiv in Richtung Land der Mikrooptimierung, aber hey: Der Code, an dem ich arbeite, kaut jeden Tag Millionen von Artikeln durch, und es ist Freitag. Also habe ich ein bisschen experimentiert ...

for ($i = 0; $i < 1000000; $i++) {
    // Option 1: simple casting/equivalence testing
    if ((int) $value == $value && $value > 0) { ... }

    // Option 2: using is_int() and ctype_digit().  Note that ctype_digit implicitly rejects negative values!
    if ((is_int($value) && $value > 0) || ctype_digit($value)) { ... }

    // Option 3: regular expressions
    if (preg_match('/^\d+$/', $value)) { ... }
}

Ich habe dann die obigen Tests für Ganzzahl- und Zeichenfolgewerte ausgeführt

Option 1: einfaches Gießen/Äquivalenztest

  • Ganzzahl: 0,3 s
  • Zeichenfolge: 0.4s

Option 2: Verwenden von is_int () und ctype_digit ()

  • Ganzzahl: 0,9 s
  • Zeichenfolge: 1.45s

Option 3: reguläre Ausdrücke

  • Ganzzahl: 1,83 s
  • Zeichenfolge: 1.60s

Kein Wunder, dass Option 1 bei weitem die schnellste ist, da es keine Funktionsaufrufe gibt, sondern nur Casting. Es ist auch erwähnenswert, dass Option 1 im Gegensatz zu den anderen Methoden den String-Float-Integer-Wert "5.0" als Ganzzahl behandelt:

$valList = array(5, '5', '5.0', -5, '-5', 'fred');
foreach ($valList as $value) {
    if ((int) $value == $value && $value > 0) {
        print "Yes: " . var_export($value, true) . " is a positive integer\n";
    } else {
        print "No: " . var_export($value, true) . " is not a positive integer\n";
    }
}

Yes: 5 is a positive integer
Yes: '5' is a positive integer
Yes: '5.0' is a positive integer
No: -5 is not a positive integer
No: '-5' is not a positive integer
No: 'fred' is not a positive integer

Ob das für Ihren speziellen Anwendungsfall gut ist oder nicht, bleibt dem Leser als Übung überlassen ...

11
Jamie Mann

Die andere beste Methode zum Überprüfen einer Integer-Zahl ist der reguläre Ausdruck. Mit dem folgenden Code können Sie den Integer-Wert überprüfen. Es wird für Float-Werte falsch sein.

if(preg_match('/^\d+$/',$i)) {
  // valid input.
} else {
  // invalid input.
}

Es ist besser, wenn Sie prüfen können, ob auch $ i> 0 ist.

5
Harsha

Statt nach int OR string zu suchen, mit mehreren Bedingungen wie:

if ( ctype_digit($i) || ( is_int($i) && $i > 0 ) )
{
    return TRUE;
}

sie können dies vereinfachen, indem Sie die Eingabe in (string) umwandeln, sodass der eine ctype_digit-Aufruf sowohl die string- als auch die int-Eingabe überprüft:

if( ctype_digit( (string)$i ) )
{
    return TRUE;
}
2
WebChemist

Definition:

!A = !is_numeric($i)
B = $i < 1
!C = $i != round($i)

Dann...

! is_numeric ($ i) || $ i <1 || $ i! = rund ($ i)  entspricht ! A || B || ! C

So:

!A || B || !C = !A || !C || B

Verwenden Sie nun den deMorgan-Theorem, d. H. (! A ||! C) = (A && C), dann: 

!A || !C || B = (A && C) || B

Man beachte nun, dass A && C = is_numeric ($ i) && $ i == round ($ i) ist, aber wenn $ i == round ($ i) WAHR ist, dann ist is_numeric ($ i) auch WAHR wir können A && C = C vereinfachen,

(A && C) || B = C || B = 

$i == round($i) || $i < 1

Sie müssen also nur Folgendes verwenden:

$i = $user_input_value;
if ($i == round($i) || $i < 1) {
  return TRUE;
}
2

Laravel 4.2 Validierungsregel für positive Zahl

Es werden nur positive Zahlen einschließlich Float-Werten benötigt.

public static $rules = array(
    'field_name' => 'required|regex:/^\d*\.?\d*$/'
);

z.B. 20,2,6,06

2
user1895505

Zusätzlich zu allen anderen Antworten: Sie suchen wahrscheinlich nach ctype_digit . Es wird nach einer Zeichenfolge gesucht, die nur Ziffern enthält.

2
NikiC

Um nach einer positiven Ganzzahl zu suchen, verwenden Sie Folgendes: 

$i = $user_input_value;
if (is_int($i) && $i > 0) {
  return true; //or any other instructions 
}

OR

$i = $user_input_value;
if (!is_int($i) || $i < 1) {
  return false; //or any other instructions 
}

Verwenden Sie diejenige, die zu Ihrem Zweck passt, da sie gleich sind. Die folgenden Beispiele zeigen den Unterschied zwischen is_numeric() und is_int():

is_numeric(0);     // returns true
is_numeric(7);     // returns true
is_numeric(-7);    // returns true
is_numeric(7.2);   // returns true
is_numeric("7");   // returns true
is_numeric("-7");  // returns true
is_numeric("7.2"); // returns true
is_numeric("abc"); // returns false

is_int(0);     // returns true
is_int(7);     // returns true
is_int(-7);    // returns true
is_int(7.2);   // returns false
is_int("7");   // returns false
is_int("-7");  // returns false
is_int("7.2"); // returns false
is_int("abc"); // returns false
1
Amr

Ok, ich weiß, dass dieser Thread wirklich alt ist, aber ich teile die Meinung von @Jeffrey Vdovjak: Da ich ihn gefunden habe, könnte er trotzdem jemandem da draußen helfen.

php's gmp_sign () könnte eine andere einfache Möglichkeit sein, dies zu überprüfen. Es funktioniert für ganzzahlige und numerische Zeichenfolgen und gibt 1 zurück, wenn a positiv ist, -1, wenn a negativ ist, und 0, wenn a Null ist.

So:

// positive
echo gmp_sign("500") . "\n";

// negative
echo gmp_sign("-500") . "\n";

// zero
echo gmp_sign("0") . "\n";

wird ausgeben:

1
-1
0

Siehe Funktionshandbuch unter http://php.net/manual/de/function.gmp-sign.php

P.S. Sie müssen php_gmp.dll in Ihrer INI-Datei aktivieren.

1
Ola

Im ersten Beispiel wird mit round überprüft, ob es sich bei der Eingabe um eine Ganzzahl handelt und nicht um einen anderen numerischen Wert (dh eine Dezimalzahl). 

is_int gibt false zurück, wenn ein String übergeben wird. Siehe die Handbuchbeispiele PHP für is_int

1
nybbler

Sie müssen nicht wirklich alle drei Prüfungen verwenden, und wenn Sie eine positive Ganzzahl wünschen, möchten Sie möglicherweise das Gegenteil von dem tun, was in Ihrem Code enthalten ist:

if(is_numeric($i) && $i >= 0) { return true; }

Weitere Informationen zum Unterschied zwischen is_int() und is_numeric() finden Sie in der Antwort von Sören.

1
JeroenEijkhof
    preg_match('{^[0-9]*$}',$string))

und wenn Sie die Länge begrenzen wollen:

    preg_match('{^[0-9]{1,3}$}',$string)) //minimum of 1 max of 3

Also pisitive int mit einer maximalen Länge von 6:

    if(preg_match('{^[0-9]{1,6}$}',$string)) && $string >= 0)
1
SuperSpy

Alle diese Antworten übersehen die Tatsache, dass der Anforderer die Formulareingabe überprüfen kann.
Die is_int () schlägt fehl, da die Formulareingabe eine Zeichenfolge ist.
is_numeric () gilt auch für Float-Nummern.
Deshalb kommt die $ i ==-Runde ($ i) ins Spiel, da geprüft wird, ob die Eingabe eine ganze Zahl ist.

1
Han Koster
if(preg_match('/^[1-9]\d*$/',$i)) {
   //Positive and > 0
}
1
Mirko Pagliai

Ich würde so etwas machen:

if ((int) $i > 0) {
    // this number is positive
}

Die Zahl wird in eine positive oder negative Zahl umgewandelt, abhängig davon, ob das Minuszeichen vorne steht. Vergleicht dann die Typumwandlungsnummer mit einer Zahl größer als 0, um zu bestimmen, ob die Anzahl positiv ist.

0
Ozzy

Das ist meine Lösung, hoffe hilfreich:

if (is_numeric($i) && (intval($i) == floatval($i)) && intval($i) > 0)
   echo "positive integer";

ich überprüfe, ob die Zeichenfolge numerisch ist, und zweitens, ob sie eine Ganzzahl ist, und drittens, um sicher zu gehen, dass sie positiv ist

0
Tín Tử Tế

Wenn Sie "is_int" verwenden, muss die Variable eine Ganzzahl sein, es kann also kein Float-Wert sein. (keine Runde nötig). 

0
ipsum
if(isset($i) && is_int($i) && $i >= 0){ //0 is technically a postive integer I suppose
    return TRUE; //or FALSE I think in your case.
}
0
Matt Asbury