Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Какой из вариантов проверки целого числа лучше?

Сообщения:  [1-10]   [11-18] 

 
 автор: TetRiska   (13.10.2012 в 23:01)   письмо автору
 
   для: Jackson   (13.10.2012 в 12:23)
 

данные отправляются на сервер не через сабмит формы, а через jquery post

для эксперимента создал массив с такими данными:

$data = array(
    0  => array(5, "test", 12),
    1  => -5,
    2  => "-5",
    3  => 5,
    4  => "5",
    5  => 0,
    6  => "0",
    7  => 3.4,
    8  => "3.4",
    9  => -3.4,
    10 => "-3.4",
    11 => "test",
    12 => 5+"test",
    13 => "5test",
    14 => "test"+5,
    15 => "test5",
    16 => 09,
    17 => "09",
    18 => 0-9,
    19 => false,
    20 => true,
    21 => null,
    22 => ""
);

и начал пробовать смотреть вывод:

$num = 0;
foreach ($data as $value){
    if(gettype($value) == 'integer' && $value > 0){
        echo $num." => ".gettype($value)." => ".$value."<br/>";
    }
    $num++;
}

или

$num = 0;
foreach ($data as $value){
    if(is_int($value) == true && $value > 0){
        echo $num." => ".gettype($value)." => ".$value."<br/>";
    }
    $num++;
}

даст

3  => integer => 5
12 => integer => 5
14 => integer => 5

это логически верно, т.к. если мы передаем в пхп обработчик ИД товара (допустим), то он естественно должен быть числовым типом, отличным от ноля

другие примеры не прошли проверку т.к. там проскакивают различные типы данных, хотя в итоге мы получим значение, которые еще придется обработать, но если посудить, зачем пропускать левый тип, который наверняка послан "кем-то"

$num = 0;
foreach ($data as $value){
    if(intval($value) > 0){
        echo $num." => ".gettype($value)." => ".$value."<br/>";
    }
    $num++;
}

или

$num = 0;
foreach ($data as $value){
    if((int)$value > 0){
        echo $num." => ".gettype($value)." => ".$value."<br/>";
    }
    $num++;
}

даст

0  => array => Array
3  => integer => 5
4  => string => 5
7  => double => 3.4
8  => string => 3.4
12 => integer => 5
13 => string => 5test
14 => integer => 5
17 => string => 09
20 => boolean => 1

  Ответить  
 
 автор: confirm   (13.10.2012 в 13:10)   письмо автору
 
   для: Jackson   (13.10.2012 в 12:54)
 

Я все таки, на 99.999% уверен, что проверяемые данные из формы, просто исхожу из того, что этими нуликами и цифрами автор "наследил" в трех разделах форума.
Ну а почему "0.21" не будет истиной, это ведь число? Данная функция не обязана проверять, что это за число, авторы ее на это не уполномочили.

Я не знаю, чего в конечном итоге хочется автору, но из его изложения могу сказать только одно - число, строка, массив, это разные типы данных, и проверить сразу все на принадлежность к одному, плюс значение, действием "два в одном" не получится. Типы, это типы, а значения, это характеристика типа, так что как бы одно строкой да покрасивее, это из разряда излишних душевных терзаний, не более.

  Ответить  
 
 автор: Jackson   (13.10.2012 в 12:54)   письмо автору
 
   для: Jackson   (13.10.2012 в 12:43)
 

да, и вовсе не факт, что данные поступают из формы )))

и опять таки, если дать функции is_numeric строку с действительным числом "0.21" будет истина.

  Ответить  
 
 автор: Jackson   (13.10.2012 в 12:43)   письмо автору
 
   для: confirm   (13.10.2012 в 12:35)
 

попался. действительно форма возвращает всегда строковые значения...

  Ответить  
 
 автор: confirm   (13.10.2012 в 12:35)   письмо автору
 
   для: Jackson   (13.10.2012 в 12:30)
 

А если подумать? Если проверяются данные из формы, а это, даже если и содержащие целые числа, строковые значения. А данная функция может вернуть true только именно для целого ЧИСЛА. Об этом ведь даже в описании ее сказано, копирую специально для вас:

Замечание:

Чтобы проверить, что переменная является числом или строкой, содержащей число (как поле ввода в форме, которое всегда является строкой), используйте is_numeric().

А что он будет делать с 08 и т.п., я не знаю, как и не знаю чего он еще захочет проверять, кроме строк, массивов....

  Ответить  
 
 автор: Jackson   (13.10.2012 в 12:30)   письмо автору
 
   для: confirm   (13.10.2012 в 12:25)
 

со всем полностью согласен... про строку погорячился.

а проверить, является ли значение переменной целым типом, можно просто функцией is_int($id);

только что автор будет делать дальше, если ему передадут 08 или 09 - это открытый вопрос

  Ответить  
 
 автор: confirm   (13.10.2012 в 12:25)   письмо автору
 
   для: Jackson   (13.10.2012 в 12:21)
 

А строка значит все такие 1 будет возвращать? А не наоборот ли?
А почему массив так возвращает, так это вытекает из того, что это простое преобразование булевого значения (равноценно, как если бы проверяли if($array)) в этом случае - false (0) для пустого массива, и true (1) для имеющего элементы.

  Ответить  
 
 автор: Jackson   (13.10.2012 в 12:23)   письмо автору
 
   для: confirm   (13.10.2012 в 12:11)
 

>А вы внимательно прочли условия автора?

ну мне сразу показалось, что автор хочет проверить целое ли ему число дали или какой то иной тип :)

  Ответить  
 
 автор: Jackson   (13.10.2012 в 12:21)   письмо автору
 
   для: confirm   (13.10.2012 в 12:19)
 

>>а при массиве и строке - вернет 1...
>
>Это кто такое вернет, преобразование в integer? А не ошибаетесь?

(int) вернет... согласен с замечаниями выше про пустой и заполненный массив - соответственно 0 и 1 будет

  Ответить  
 
 автор: confirm   (13.10.2012 в 12:19)   письмо автору
 
   для: Jackson   (13.10.2012 в 12:17)
 

>а при массиве и строке - вернет 1...

Это кто такое вернет, преобразование в integer? А не ошибаетесь?

  Ответить  

Сообщения:  [1-10]   [11-18] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования