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

Dancrumb
quelle
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:

Gordon
quelle
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

Bobz
quelle
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...
Luke
quelle
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.

einsamer Tag
quelle
5

Sie können die folgende One-Anweisung ausprobieren:

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

oder:

if (max(min($x, $max), $min) == $x)
Kenorb
quelle
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;
     }
Jefkine Kafunah
quelle
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)
Nabil Kadimi
quelle
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;
}
Gajen Sunthara
quelle
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;
    }
Verknüpfung
quelle
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];
  }
Miquel
quelle
-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
Justin Levene
quelle