Comments 26
Cпасибо, пригодиться. Хотя у меня тоже есть в рукаве такие штуки :P
+2
хы какраз на днях примерно такое же писал)))
-3
Не вижу смысла гнаться за милисекундами, но имхо
логичнее, чем
$format = str_replace(array("M", "F"), array($rus[$month], $rus2[$month]), $format);
логичнее, чем
$format = preg_replace(array("'M'", "'F'"), array($rus[$month], $rus2[$month]), $format);
+3
UFO just landed and posted this here
извините, а давно ли можно в пыхе писать
return $words[];
это вообще говоря fatal error
return $words[];
это вообще говоря fatal error
0
Я бы еще добавил «нет комментариев».
+2
Ну, это скорее нужно делать за пределами этой функции, т.к. она именно для склонения существительных, а не только для комментов. Обычную логическую конструкцию на проверку переменной $count перед вызовом функции сделать логичнее с точки зрения универсальности, имхо.
+1
echo human_date(strtotime('+1 day'));
почему послезавтра?:)
почему послезавтра?:)
+1
вот бы еще таких статей сюда, только мне кажется надо в отдельный блог — «php, готовые решения»
0
Для функции declension() я бы использовал более продвинутый вариант:
Позволяет писать, к примеру, так:
(выведет «написано 33 комментария»).
А вообще, Ваша функция (как и название) очень похожа на то, что представлено на форуме дклаб: forum.dklab.ru/viewtopic.php?t=6760
function declension($digit,$expr,$onlyword=false)
{
if(!is_array($expr)) $expr = array_filter(explode(' ', $expr));
if(empty($expr[2])) $expr[2]=$expr[1];
$i=preg_replace('/[^0-9]+/s','',$digit)%100; //intval не всегда корректно работает
if($onlyword) $digit='';
if($i>=5 && $i<=20) $res=$digit.' '.$expr[2];
else
{
$i%=10;
if($i==1) $res=$digit.' '.$expr[0];
elseif($i>=2 && $i<=4) $res=$digit.' '.$expr[1];
else $res=$digit.' '.$expr[2];
}
return trim($res);
}
Позволяет писать, к примеру, так:
echo 'Написано '.declension('<b>33</b>','комментарий комментария комментариев');
(выведет «написано 33 комментария»).
А вообще, Ваша функция (как и название) очень похожа на то, что представлено на форуме дклаб: forum.dklab.ru/viewtopic.php?t=6760
0
Кстати для подсчета правильного относительного смещения по времени тоже есть класс, который это делает:
forum.dklab.ru/viewtopic.php?p=35068#35068
forum.dklab.ru/viewtopic.php?p=35068#35068
0
Да, прямая ссылка на класс: m.forum.dklab.ru/files/date_deltarussian.zip
0
По-моему, класс для таких мелочей — это перебор. Но за ссылку спасибо, покопаюсь.
0
Название — это слово «склонение» на английском. Ничего удивительного. (: А функция похожа только в том месте, где собственно склоняется. Это, в общем, довольно распространенный алгоритм.
Насчет приведенной функции согласен, обычно это удобнее. Если в склоняемых формах нет пробела. Правда регексп для выделения числа из форматированной строки — совершенно лишнее, имхо.
Насчет приведенной функции согласен, обычно это удобнее. Если в склоняемых формах нет пробела. Правда регексп для выделения числа из форматированной строки — совершенно лишнее, имхо.
+1
В русском языке есть небольшая нелогичность в согласовании существительных с числом:
1 комментарий,
2 комментария,
5 комментариев,
23 комментария,
71 комментарий…
Но!
11 комментариев,
12 комментариев,
13 комментариев,
14 комментариев.
Поэтому нужно проверять не только число единиц, но и число десятков.
У меня похожая функция выглядела так:
Код корявый и намертво вгрызается в свои модули со вспомогательными функциями, но общий смысл, я думаю, понятен. В случае, если непрочитанных сообщений нет, это напоминание просто не выводится.
1 комментарий,
2 комментария,
5 комментариев,
23 комментария,
71 комментарий…
Но!
11 комментариев,
12 комментариев,
13 комментариев,
14 комментариев.
Поэтому нужно проверять не только число единиц, но и число десятков.
У меня похожая функция выглядела так:
/* Вывод оповещения о непрочитанных сообщениях выбранного пользователя */
function getUserNewMessageNotice(&$DB, $userId)
{
$MESSAGE_COUNT = getUserNewMessageCount($DB, $userId);
if (accountIsBanned($DB, $_SESSION['userId'], $_SESSION['userStatus'])
|| accountIsDeleted($DB, $_SESSION['userId'], $_SESSION['userStatus'])
|| $MESSAGE_COUNT == 0)
{ // Если новых сообщений нет или пользователь заблокирован или удалён, напоминание не выводится
return NULL;
}
$NOTICE = 'В Вашем почтовом ящике ';
switch ($MESSAGE_COUNT)
{
// Согласование существительного <сообщение> в нужном числе с количеством новых сообщений
// Одно сообщение, два сообщение, три сообщение, четыре сообщение, двадцать одно сообщение, тридцать два сообщение,
// НО! Одиннадцать писЕМ, двенадцать сообщений, тринадцать сообщений и четырнадцать сообщений.
// Для всех чисел, оканчивающихся на 1, 2, 3 и 4 окончание будет <-ий>, кроме 11, 12, 13 и 14.
// Для всех остальных - <ие>. Такой вот он забавный, русский язык.
case ((1 != floor(($MESSAGE_COUNT % 100) / 10)) && ($MESSAGE_COUNT % 10 == 1)):
$NOTICE .= 'находится '.$MESSAGE_COUNT.' новое сообщение.';
break;
case ((1 != floor(($MESSAGE_COUNT % 100) / 10)) && (($MESSAGE_COUNT % 10 == 2) || ($MESSAGE_COUNT % 10 == 3) || ($MESSAGE_COUNT % 10 == 4))):
$NOTICE .= 'находятся '.$MESSAGE_COUNT.' новых сообщения.';
break;
default:
$NOTICE .= 'находятся '.$MESSAGE_COUNT.' новых сообщений.';
break;
}
return $NOTICE;
}
Код корявый и намертво вгрызается в свои модули со вспомогательными функциями, но общий смысл, я думаю, понятен. В случае, если непрочитанных сообщений нет, это напоминание просто не выводится.
0
<?php
$numbers = array(1, 2, 5, 23, 71, 11, 12, 13, 14);
$words = array('комментарий', 'комментария', 'комментариев');
foreach($numbers as $number) printf('%d %s
', $number, declension($number, $words));
?>
Выводит:
1 комментарий
2 комментария
5 комментариев
23 комментария
71 комментарий
11 комментариев
12 комментариев
13 комментариев
14 комментариев
Почитайте внимательнее приведенную мной функцию. Эта особенность там учитываются, если число больше 20. Только строчек в ней значительно меньше.
+1
Sign up to leave a comment.
Набор PHP-функции для создания user-friendly интерфейса на русском языке