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 не е строго въведен. Публикувах подобен въпрос (макар и не толкова подобно) за isset по-рано тази седмица. Едно нещо, което трябва да се отбележи, е, че PHP ще промени низа ви на целочислената му стойност за сравнения по време на някои случаи (когато има смесени типове). Това не може да се пренебрегне. Мисля, че това е силен аргумент за is_numeric

от Ръководство за PHP

Ако сравните число с низ или сравнението включва числови низове, тогава всеки низ се преобразува в число и сравнението се извършва числено. Тези правила се прилагат и за оператора switch. Преобразуването на типа не се извършва, когато сравнението е === или !==, тъй като това включва сравняване на типа, както и на стойността.

Друго нещо, за което трябва да помислите, е "какво е 0" в PHP. Означава много. Не винаги е числово. Може да е числов низ, булево невярно, цяло число и т.н... Ето защо съществуват тези помощни функции.

За да добавя към отговора си:

променете примера си:

$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 във вашия код. Все пак може да искате да го използвате, защото ако не го направите, тогава нещо може да ви се промъкне (ако получите номера от DB, който винаги е 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

Как мога да получа NSMenu или NSMenuItem за менюто на приложението (това в лентата с менюта до менюто на ябълката). Изглежда, че е автоматично създаден и независим от NSMenu, което зададох чрез NSApplication setMainMenu.

Между другото: изграждам пълното си приложение без Xcode, така че моля без съвети за InterfaceBuilder.

PS: MacOSX 10.5

- 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