Wie überprüfe ich, ob eine Ganzzahl in PHP innerhalb eines Zahlenbereichs liegt?


Antworten:


129

Der Ausdruck:

 ($min <= $value) && ($value <= $max)

wird wahr sein, wenn $valuezwischen $minund $maxeinschließlich ist

Weitere Informationen zu Vergleichsoperatoren finden Sie in den PHP-Dokumenten


Nein, wird es nicht. Beide Vergleichsoperatoren sollten <= sein, oder die Operanden des zweiten Teils des Ausdrucks sollten ausgetauscht werden. ($ value sollte nicht größer als $ max sein).
GolezTrol

Sie müssen diesen Kommentar hinzugefügt haben, während ich meinen Fehler korrigierte ... dieser Ausdruck ist jetzt korrekt
Dancrumb

3
Abhängig davon, ob das OP wirklich "Ganzzahl" bedeutet, wenn nach "Ganzzahl" gefragt wird, führt dies zu falschen Ergebnissen, wenn $valuees sich um ein Float handelt. Da auch der Vergleich lose ist, kann zu falsch Ergebnis einen String übergeben, zum Beispiel (0 <= 'string') && ('string' <= 10) );ist trueaufgrund Jonglieren geben.
Gordon

@ Gordon, nur wenn Sie möchten, dass die Grenzwerte inklusiv behandelt werden ... aber dennoch ein gültiger Punkt
Dancrumb

Zwar benötigt der PHP-Interpreter keine Klammern, es ist jedoch eine Frage des Stils, ob dies für Ingenieure hilfreich ist. Persönlich mag ich die explizite Natur der Klammern in diesem Ausdruck und ich denke nicht, dass sie Unordnung hinzufügen. Ich denke jedoch, dass sie sich laut anfühlen würden, wenn Sie die (int)Darsteller einbeziehen. In diesem Fall würde ich mich wahrscheinlich dafür entscheiden, sie wegzulassen.
Dancrumb

119

Sie können verwenden filter_var

filter_var(
    $yourInteger, 
    FILTER_VALIDATE_INT, 
    array(
        'options' => array(
            'min_range' => $min, 
            'max_range' => $max
        )
    )
);

Auf diese Weise können Sie auch angeben, ob Sie die Oktal- und Hex-Notation von Ganzzahlen zulassen möchten . Beachten Sie, dass die Funktion typsicher ist. 5.5ist keine Ganzzahl, sondern ein Float und wird nicht validiert.

Ausführliches Tutorial zum Filtern von Daten mit PHP:


1
@ Gordon, Sie hören nie auf, mich zu überraschen
Samayo

Am besten geeignete Antwort.
Aman Aujla

Ausgefallene Lösung.
Kevin Bui

31

Könnte helfen:

if ( in_array(2, range(1,7)) ) {
    echo 'Number 2 is in range 1-7';
}

http://php.net/manual/en/function.range.php


12
Bemerkenswert ist, dass aufgrund der Erzeugung des Bereichs Speicherkosten anfallen.
Dancrumb

1
Einfache und elegante Lösung. Lief wie am Schnürchen.
pr1nc3

2
@ pr1nc3, aber diese Lösung ist sehr langsam und sehr speicherhungrig, wenn es sich um einen großen Bereich handelt.
Hanshenrik

13

Sie könnten eine kleine Hilfsfunktion entwickeln, um dies zu tun:

/**
 * Determines if $number is between $min and $max
 *
 * @param  integer  $number     The number to test
 * @param  integer  $min        The minimum value in the range
 * @param  integer  $max        The maximum value in the range
 * @param  boolean  $inclusive  Whether the range should be inclusive or not
 * @return boolean              Whether the number was in the range
 */
function in_range($number, $min, $max, $inclusive = FALSE)
{
    if (is_int($number) && is_int($min) && is_int($max))
    {
        return $inclusive
            ? ($number >= $min && $number <= $max)
            : ($number > $min && $number < $max) ;
    }

    return FALSE;
}

Und du würdest es so benutzen:

var_dump(in_range(5, 0, 10));        // TRUE
var_dump(in_range(1, 0, 1));         // FALSE
var_dump(in_range(1, 0, 1, TRUE));   // TRUE
var_dump(in_range(11, 0, 10, TRUE)); // FALSE

// etc...

Ihr Skript erleichtert das Leben
Sojimaxi

8
if (($num >= $lower_boundary) && ($num <= $upper_boundary)) {

Möglicherweise möchten Sie die Vergleichsoperatoren anpassen, wenn die Grenzwerte nicht gültig sein sollen.


5

Sie können die folgende One-Anweisung ausprobieren:

if (($x-$min)*($x-$max) < 0)

oder:

if (max(min($x, $max), $min) == $x)

1

mit einem Schaltergehäuse

    switch ($num){

        case ($num>= $value1 && $num<= $value2): 
            echo "within range 1";
        break;
        case ($num>= $value3 && $num<= $value4): 
            echo "within range 2";
        break;
        .
        .
        .
        .
        .

        default: //default
            echo "within no range";
        break;
     }

4
Sollte sein switch(true), andernfalls wenn $num == 0die Falllogik fehlschlägt, weil PHP versucht, übereinzustimmen 0 == ($num>= $value1 && $num<= $value2)usw. Ich habe dies als Bearbeitung vorgeschlagen.
Zane

1

Einige andere Möglichkeiten:

if (in_array($value, range($min, $max), true)) {
    echo "You can be sure that $min <= $value <= $max";
}

Oder:

if ($value === min(max($value, $min), $max)) {
    echo "You can be sure that $min <= $value <= $max";
}

Tatsächlich wird dies verwendet, um einen Wert umzuwandeln, der außerhalb des Bereichs zum nächstgelegenen Ende liegt.

$value = min(max($value, $min), $max);

Beispiel

/**
 * This is un-sanitized user input.
 */
$posts_per_page = 999;

/**
 * Sanitize $posts_per_page.
 */
$posts_per_page = min(max($posts_per_page, 5), 30);

/**
 * Use.
 */
var_dump($posts_per_page); // Output: int(30)

1
Das Min Max ist so eine schöne Lösung.
Skid Kadda

0

Eine andere Möglichkeit, dies mit einem einfachen if / else-Bereich zu tun. Zum Beispiel:

$watermarkSize = 0;

if (($originalImageWidth >= 0) && ($originalImageWidth <= 640)) {
    $watermarkSize = 10;
} else if (($originalImageWidth >= 641) && ($originalImageWidth <= 1024)) {
    $watermarkSize = 25;
} else if (($originalImageWidth >= 1025) && ($originalImageWidth <= 2048)) {
    $watermarkSize = 50;
} else if (($originalImageWidth >= 2049) && ($originalImageWidth <= 4096)) {
    $watermarkSize = 100;
} else {
    $watermarkSize = 200;
}

0

Ich habe eine Funktion erstellt, um zu überprüfen, ob sich die Zeiten in einem Array irgendwie überschneiden:

    /**
     * Function to check if there are overlapping times in an array of \DateTime objects.
     *
     * @param $ranges
     *
     * @return \DateTime[]|bool
     */
    public function timesOverlap($ranges) {
        foreach ($ranges as $k1 => $t1) {
            foreach ($ranges as $k2 => $t2) {
                if ($k1 != $k2) {
                    /* @var \DateTime[] $t1 */
                    /* @var \DateTime[] $t2 */
                    $a = $t1[0]->getTimestamp();
                    $b = $t1[1]->getTimestamp();
                    $c = $t2[0]->getTimestamp();
                    $d = $t2[1]->getTimestamp();

                    if (($c >= $a && $c <= $b) || $d >= $a && $d <= $b) {
                        return true;
                    }
                }
            }
        }

        return false;
    }

0

Hier ist mein kleiner Beitrag:

function inRange($number) {
  $ranges = [0, 13, 17, 24, 34, 44, 54, 65, 200];
  $n = count($ranges);

  while($n--){
    if( $number > $ranges[$n] )
      return $ranges[$n]+1 .'-'. $ranges[$n + 1];
  }

-1
function limit_range($num, $min, $max)
{
  // Now limit it
  return $num>$max?$max:$num<$min?$min:$num;
}

$min = 0;  // Minimum number can be
$max = 4;  // Maximum number can be
$num = 10;  // Your number
// Number returned is limited to be minimum 0 and maximum 4
echo limit_range($num, $min, $max); // return 4
$num = 2;
echo limit_range($num, $min, $max); // return 2
$num = -1;
echo limit_range($num, $min, $max); // return 0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.