PHP - необходимо использование is_numeric () или можно использовать знаки сравнения для всех положительных числовых случаев?

Кажется, что простые знаки сравнения >,>= и их обратные компоненты могут оценить, является ли определенная переменная числом или нет. Пример $whatami='beast'; ($whatami<0)?echo 'NaN':echo 'is numeric!';

Есть ли случаи, когда is_numeric() необходимо использовать для положительных значений (число> 0)? Похоже, что использование приведенных выше знаков сравнения позволит определить, является ли переменная числовой.


person ina    schedule 23.07.2010    source источник
comment
примечание - для `положительных значений   -  person ina    schedule 23.07.2010
comment
наиболее частым использованием здесь будет разбиение на страницы (обычно никогда не отрицательное) - использование только одной проверки сравнения, которая интерпретирует только положительные числа, может помочь с процессорным временем. приведенный выше пример $ whatami только с проверкой сравнения будет оцениваться как NaN, даже если переменная является строкой   -  person ina    schedule 23.07.2010
comment
В PHP нет понятия NaN, как в других языках ... см. Мой ответ. В некоторых математических функциях может возвращаться NAN, но это не правило для всего языка. Есть даже проверка для nan: php.net/manual/en/function.is -nan.php   -  person TCCV    schedule 23.07.2010
comment
ну, я думаю, вопрос здесь в меньшем подмножестве - в основном проверить, является ли переменная положительным числом или нет. В общем случае вам понадобится is_numeric (), но я не смог найти случай, когда ($var<0) только не проверяет, является ли ввод положительным числом или чем-то другим.   -  person ina    schedule 23.07.2010


Ответы (4)


Как я выяснил, многие из этих вспомогательных функций действительно необходимы, потому что PHP не является строго типизированным. Я отправил аналогичный вопрос (хотя и не то похожее) об исете ранее на этой неделе. Следует отметить, что PHP изменит вашу строку на ее целочисленное значение для сравнения в некоторых случаях (когда есть смешанные типы). Это нельзя упускать из виду. Я думаю, это веские доводы в пользу is_numeric

из Руководства по PHP

Если вы сравниваете число со строкой или сравнение включает числовые строки, каждая строка преобразуется в число, и сравнение выполняется численно. Эти правила также применимы к оператору switch. Преобразование типа не происходит при сравнении === или! ==, поскольку это включает сравнение типа, а также значения.

Еще одна вещь, о которой следует подумать, - это то, что в PHP «что равно 0». Это значит многое. Это не всегда числовое значение. Это может быть числовая строка, логическое значение false, целое число и т. Д. Вот почему существуют эти вспомогательные функции.

Чтобы добавить к моему ответу:

измените свой пример:

$whatami='beast';  
($whatami<5) ? echo 'less than 5' : echo 'more than 5';

PHP заменит «зверя» на его целочисленный эквивалент, а затем произведет сравнение. Это дало бы непредвиденные результаты. Если вам действительно нужно что-то подобное, вам придется обернуть это в другое условное выражение:

$whatami='beauty';  
if(is_numeric($whatami){
    ($whatami<5) ? echo 'less than 5' : echo 'more than 5';
} else {
    exit('what, am I not pretty enough for a beast?');
}

Тогда вы получите желаемый результат (как бы странно это ни было).

person TCCV    schedule 23.07.2010
comment
Хорошо - извините, я хотел сказать, что это всего лишь проверка на положительные числовые значения. (числа ›0) - это подмножество проверенных переменных, которые необходимо принять. См. Комментарии выше! - person ina; 23.07.2010
comment
если вы уже проверили или преобразовали переменную и уверены, что она не изменилась, то вы можете спокойно оставить is_numeric для сравнения или точно знать, что это числовое значение. Это (своего рода) предполагает, что вы уже использовали is_numeric в своем коде. Вы все равно можете захотеть использовать его, потому что если вы этого не сделаете, то что-то может подкрасться к вам (если вы получите номер из БД, который всегда имеет INT, что произойдет, если запрос не удастся или вернет NULL?) - person TCCV; 23.07.2010

Существует большая разница между «может оценить, является ли определенная переменная числом или нет» и «оценить, является ли определенная переменная положительным числом». Использование знаков сравнения требует, чтобы вы протестировали его дважды (оба > & <= или >= & <) и могут быть не сразу очевидны. is_numeric означает, что вам нужен только один тест, и делает совершенно очевидным, что вы делаете.

Кроме того, строка будет оцениваться как 0, что означает, что она выкидывает вашу идею. Придерживайтесь правильных команд :)

Согласно комментарию: В этом случае вы просите сравнить is_numeric с тестом на положительные числа, исключая 0. Это не предназначено для is_numeric, поэтому, естественно, в этом нет необходимости. Если вы выполняете математическую проверку, которая включает 0 в качестве ответа или как часть диапазона, вам понадобится is_numeric, иначе он вам не понадобится. В первой части вашего вопроса задается другой вопрос, поэтому:

Кажется, что простые знаки сравнения>,> = и их обратные компоненты могут оценить, является ли определенная переменная числом или нет - Неправильно

Есть ли случаи, когда is_numeric() необходимо использовать для положительных значений (число> 0)? - Нет

Похоже, что использование приведенных выше знаков сравнения позволит определить, является ли переменная числовой - Нет. Они могут определить, является ли переменная ненулевым числом или неизвестным, но не числовым.

person Dan McGrath    schedule 23.07.2010
comment
оценка как 0 - это нормально, поскольку принимаются только положительные числовые значения. (0 выбрасывается!) - извините, я должен был выделить положительные числовые значения жирным шрифтом выше - только что сделал - person ina; 23.07.2010

Сравнение будет зависеть от типа данных в левой части оператора.

Важно помнить, что PHP - это не строго типизированный язык. Если вы хотите сравнить число и убедиться, что это число, то да, is_numeric() будет хорошей проверкой. Например,

echo (is_numeric($whatami) && $whatami < 0) ? 'number greater than zero' : 'NaN or negative';

Однако это не следует обобщать. Если вы можете больше прокомментировать то, что вы хотите сделать, вы можете найти более подробный ответ.

person Jason McCreary    schedule 23.07.2010
comment
кажется, что простая проверка ($whatami<0) позволит определить, положительное ли это число или что-то еще (в противном случае - строка). - person ina; 23.07.2010

Да, есть случаи.

Например:

var_dump("5aa" > 4); //bool(true)
var_dump("5aa" > 6); //bool(false)

Как видите, преобразование "5aa" в int(5). Посмотрим, что дает is_numeric:

var_dump(is_numeric("5aa")); //bool(false)

Итак, is_numeric более строгий. Насколько это необходимо, зависит от вашего приложения.

Обратите внимание, что это случаи, когда числовая строка и число не совсем одно и то же:

var_dump("255" & "2"); //string(1) "2" 
var_dump(255 & 2); //int(2)

См. поразрядные операции:

Помните о преобразованиях типов данных. Если и левый, и правый параметры являются строками, побитовый оператор будет работать со значениями ASCII символов.

person Artefacto    schedule 26.07.2010