Простая задача на php

123 4
kiowas
На сайте с 06.02.2010
Offline
61
1716

Коллеги, доброго дня.

Надеюсь админы не будут против, но создам отдельную тему.

Предлагаю подивиться на предмет того, что в PHP отсутствует, казалось бы банальная функция, которая, по идее, могла бы быть полезна практически в каждой 10 строчке любого скрипта.

Любая таблица в БД содержит один, а то и больше столбцов в которых хранятся айдишники, т.е. положительные целые числа. Согласитесь, сталкиваемся с такими данными практически в каждом втором запросе к БД!

Покамест, попробуем сделать проверку в ручную.

И так задача:

Проверить, желательно красиво и кратко, переменную, на предмет того, что она содержит целое положительное число, или строку содержащую данное число, например '13' или '142', в строке никаких лишних символов не должно быть.

Прошу примеров.

подпись
Оптимизайка
На сайте с 11.03.2012
Offline
396
#1

ctype_digit($var) || is_num($var) или ещё короче ctype_digit((string)$var)

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
kiowas
На сайте с 06.02.2010
Offline
61
#2
Оптимизайка:
ctype_digit($var) || is_num($var)

Твоя проверка выдаст фатальную ошибку если $var = -12;

---------- Добавлено 07.06.2013 в 19:18 ----------

Оптимизайка:
ctype_digit($var) || is_num($var) или ещё короче ctype_digit((string)$var)

Вторая проверка выдаст фатальную ошибку, если $var = new some_object();

Еще предложения.

siv1987
На сайте с 02.04.2009
Offline
427
#3
kiowas:
Вторая проверка выдаст фатальную ошибку, если $var = new some_object();

Бугага, если ваша переменная содержит some_object() там, где она должна содержать строку (или integer), то стоит серьезно задуматься о логике его работы.

is_numeric или is_integer, остальное либо надуманно, либо криворуко написано.

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#4

Даже если не в состоянии нагуглить, то догадаться написать свою функцию....


function myCheckDigit($num)
{
preg_match('/[^0-9]+/', $num, $matches);
if (count($matches))
{
return FALSE;
}
return TRUE;
}

Дом. задание: доработать функцию, чтобы работала с дробными и отрицательными числами. Хотя если у Вас айдишники дробные/отрицательные.....

Подпись))
kiowas
На сайте с 06.02.2010
Offline
61
#5
siv1987:
Бугага, если ваша переменная содержит new some_object(); там, где она должна содержать строку (или integer), то стоит серьезна задуматься о логике его работы.
is_numeric или is_integer, остальное либо надуманно, либо тогда криворуко написано.

Благодарю за ответ, но я отлавливаю ошибки. Если вы считаете, что ошибки всегда предсказуемы, то это наивно.

Суть не в этом. Вопрос вот в чем: как можно проверить переменную на предмет того, что она содержит целое положительное число или строку содержащую такое число, например '1' или '154'. В строке не должно быть лишних символов.

Предложите, пож-та, свой вариант, если вы такой умный, бугага.

---------- Добавлено 07.06.2013 в 19:34 ----------

Милованов Ю.С:
Даже если не в состоянии нагуглить, то догадаться написать свою функцию....

function myCheckDigit($num)
{
preg_match('/[^0-9]+/', $num, $matches);
if (count($matches))
{
return FALSE;
}
return TRUE;
}

Дом. задание: доработать функцию, чтобы работала с дробными и отрицательными числами. Хотя если у Вас айдишники дробные/отрицательные.....

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

siv1987
На сайте с 02.04.2009
Offline
427
#6
kiowas:
Благодарю за ответ, но я отлавливаю ошибки. Если вы считаете, что ошибки всегда предсказуемы, то это наивно.

Ошибки не должны быть там где по идее не должны быть. Должна же быть хоть какая-то типизация. Если проверять каждый раз переменную перед обработкой какой-то функцией то накладные расходы будут слишком больше. А таких ситуации когда переменная может быть и массив, и объект, и хз что там еще не должно быть, либо следует избегать.

kiowas:
Предложите, пож-та, свой вариант, если вы такой умный, бугага.

Варианты в этой теме озвучены, причем несколько.

kiowas
На сайте с 06.02.2010
Offline
61
#7
siv1987:
Ошибки не должны быть там где по идее не должны быть. Должна же быть хоть какая-то типизация. Если проверять каждый раз переменную перед обработкой какой-то функцией то накладные расходы будут слишком больше. А таких ситуации когда переменная может быть и массив, и объект, и хз что там не должно быть, либо следует избегать.

Это понятно. Придерживаюсь тех же принципов, но все же....

Я задал этот вопрос, потому что, как сказал один из участников, нагуглить ничего не получилось. Все с умным видом предлагают свои гениальные функции, но они не работаю. Благодарю за участие.

---------- Добавлено 07.06.2013 в 19:38 ----------

siv1987:
Варианты в этой теме озвучены, причем несколько.

Не могли бы показать, какие это варианты?

siv1987
На сайте с 02.04.2009
Offline
427
#8
kiowas:
Я задал этот вопрос, потому что, как сказал один из участников, нагуглить ничего не получилось.

ну напишите тогда свою функцию, где она будет проверять если это не объект, не массив не хз что еще, а потом примените к ней одну их стандартных функций. Ничего сложного, вроде...

kiowas:
даже если в нее банально послать 0.

Точно? var_dump(myCheckDigit('0')); => bool(true)

---------- Добавлено 07.06.2013 в 18:47 ----------

kiowas:
Твоя проверка выдаст фатальную ошибку если $var = -12;

var_dump(ctype_digit('-1')); => bool(false)

var_dump(is_numeric('-1')); => bool(true)

var_dump(is_numeric(array(1))) => bool(false)

var_dump(is_numeric(new foo)) => bool(false)

kiowas
На сайте с 06.02.2010
Offline
61
#9
siv1987:
Точно? var_dump(myCheckDigit('0')); => bool(true)

Точно! var_dump(myCheckDigit(0)); => bool(false)

Уважаемый, мне бы не хотелось здесь общаться на тему могу ли я нагуглить эту функцию или сам написать, нужна ли такая функция в реальных проектах или нет. Просто, если у вас есть на вооружении какая-то красивая функция, или вам не сложно ее написать за меня, поделитесь, пож-та. Очень надеюсь на понимание, спасибо.

siv1987
На сайте с 02.04.2009
Offline
427
#10
kiowas:
Точно! var_dump(myCheckDigit(0)); => bool(false)

kiowas, либо вы не то пишите, либо вы не то проверяете... и 0 и '0' результат bool(true). Может у нас разные версии php?..

123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий