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

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

Почему это условие возвращает FALSE, как это должно быть, а это, если:Странное поведение в состоянии IF

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

возвращает FALSE, где также переданное значение, как первый параметр 50, который находится в диапазоне ??? PHP-CLI является 7.0.9-TS-VC14-x64

Заранее спасибо

+3

Возможно, этот параметр имеет значение '' 50 "', поэтому имеет тип _string_? – arkascha

+0

Или, может быть, вы действительно хотите использовать '$ argv [0]' вместо этого, поскольку вы ссылаетесь на него как на аргумент _first_? – arkascha

+0

Что содержит '$ argv'? – Tom

ответ

1

argv[1], по умолчанию, строку. Используйте is_numeric() вместо is_int() и преобразуйте (или переведите) его в целочисленное значение, прежде чем проверять, находится ли в диапазоне.

// 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"; 
} 

ВНИМАНИЕ: is_numeric() также возвращает значение TRUE в случае значения с плавающей точкой!

+0

Заметил это. Кажется, что 'range()' автоматически преобразует тип иглы, поэтому 'intval()' не требуется – 1000Gbps

+0

Тогда ваша проблема была вызвана только использованием is_int(), которое не проверяет, являются ли значения числовой строкой , is_numeric() выполняет задание. Но, ПРЕДОСТЕРЕЖЕНИЕ: is_numeric() также возвращает TRUE в случае значения float! Не уверен, что это может повлиять на вас в этом случае. – MarcM

+0

Да, это странно, почему 'range()' не проверяет FLOATs – 1000Gbps

Смежные вопросы