2017-01-30 3 views
1
$a = 101; 

if (isset($a) && is_int($a) && in_array($a, range(1, 100))) { 
    echo "TRUE"; 
} else echo "FALSE"; 

Warum gibt diese Bedingung FALSCH, da es während dieses IF sein sollte:Seltsames Verhalten einer IF-Bedingung

if (isset($argv[1]) && is_int($argv[1]) && in_array($argv[1], range(1, 100))) { 
    echo "TRUE"; 
} else echo "FALSE"; 

kehrt auch FALSCH wo gebene Wert als erster Parameter 50 ist, die in Reichweite ist ??? PHP-CLI ist 7.0.9-TS-VC14-x64

Vielen Dank im Voraus

+3

Vielleicht hat dieser Parameter den Wert '" 50 "', also vom Typ _string_? – arkascha

+0

Oder vielleicht möchten Sie stattdessen '$ argv [0]' verwenden, da Sie es als _first_ Argument bezeichnen? – arkascha

+0

Was enthält der '$ argv'? – Tom

Antwort

1

argv[1] ist standardmäßig ein String. Verwenden Sie is_numeric() anstelle von is_int(), und konvertieren (oder umwandeln) Sie es in einen ganzzahligen Wert, bevor Sie überprüfen, ob in dem Bereich.

// var_dump($argv); // ...if you want to check $argv types and values. 
if (isset($argv[1]) && is_numeric($argv[1]) && in_array(intval($argv[1]), range(1, 100))) { 
    echo "TRUE"; 
} 
else { 
    echo "FALSE"; 
} 

ACHTUNG: is_numeric() auch im Falle eines Schwimmers TRUE!

+0

Das wurde bemerkt. Scheint 'range()' konvertiert automatisch den Typ der Nadel, so dass 'intval()' nicht notwendig ist – 1000Gbps

+0

Dann war Ihr Problem nur aufgrund der Verwendung von is_int(), die nicht überprüft, ob die Werte eine numerische Zeichenfolge ist . is_numeric() erledigt den Job. Aber ACHTUNG: is_numeric() gibt auch TRUE zurück im Falle eines float-Wertes! Nicht sicher, dass dies in diesem Fall Auswirkungen auf Sie haben könnte. – MarcM

+0

Ja, es ist seltsam, warum 'range()' FLOATs nicht überprüft – 1000Gbps