| Author |
Message |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Tue Mar 18, 2003 10:58 pm (написано за 1 минуту 55 секунд)
Post subject: Склонение русских слов после порядковых числительных
|
|
| Code (php): |
скопировать код в буфер обмена |
// Функция предназначена для вывода численных результатов с учетом// склонения слов, например: "1 ответ", "2 ответа", "13 ответов" и т.д.//// $digit — целое число// можно вместе с форматированием, например "<b>6</b>"//// $expr — массив, например: array("ответ", "ответа", "ответов").// можно указывать только первые 2 элемента, например для склонения английских слов// (в таком случае первый элемент - единственное число, второй - множественное)//// $expr может быть задан также в виде строки: "ответ ответа ответов", причем слова разделены// символом "пробел"//// $onlyword - если true, то выводит только слово, без числа;// необязательный параметр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); } |
Пример использования:
Last edited by Юрий Насретдинов on Tue Apr 14, 2009 8:55 am; edited 7 times in total
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Thu Dec 25, 2003 5:58 pm (спустя 9 месяцев 6 дней 19 часов 7 секунд)
Post subject:
|
|
| Кстати говоря, эта функция нашла применения на этом форуме. Не думаю, что прошел целый год с тех пор, как я добавил сюда эту функцию, но она тем не менее была одной из первых :)
|
|
| Back to top |
|
 |
Дмитрий Кóтеров
Администратор

Joined: 10 Mar 2003
Posts: 13664
Карма: 405 поощрить/наказать
|
Posted: Thu Dec 25, 2003 6:24 pm (спустя 25 минут)
Post subject:
|
|
Вот сколько прошло:
| yUAC wrote: |
|
спустя 8 месяцев 7 дней 20 часов 41 минуту |
|
|
| Back to top |
|
 |
Дмитрий Кóтеров
Администратор

Joined: 10 Mar 2003
Posts: 13664
Карма: 405 поощрить/наказать
|
Posted: Fri Mar 03, 2006 10:37 am (спустя 2 года 2 месяца 8 дней 16 часов 12 минут; написано за 2 минуты 12 секунд)
Post subject:
|
|
Чуть обновленная версия функции. - Не пихает число перед словом. Возвращает ТОЛЬКО само слово, это удобнее (вдруг число надо будет жирным обрамить, или еще как). - Умеет работать со словами, у которых только 2 формы склонения.
| Code (php): |
скопировать код в буфер обмена |
/** * Choost russion word declension based on numeric. * Example for $expressions: array("ответ", "ответа", "ответов") */ function declension ($int, $expressions) { if (count($expressions) < 3) $expressions[2] = $expressions[1]; settype($int, "integer"); $count = $int % 100; if ($count >= 5 && $count <= 20) { $result = $expressions['2']; } else { $count = $count % 10; if ($count == 1) { $result = $expressions['0']; } elseif ($count >= 2 && $count <= 4) { $result = $expressions['1']; } else { $result = $expressions['2']; } } return $result; } |
|
|
| Back to top |
|
 |
Дмитрий Кóтеров
Администратор

Joined: 10 Mar 2003
Posts: 13664
Карма: 405 поощрить/наказать
|
Posted: Fri Mar 03, 2006 10:38 am (спустя 1 минуту 51 секунду)
Post subject:
|
|
|
|
|
| Back to top |
|
 |
~Cache~
Заглянувший
Joined: 11 Mar 2006
Posts: 11
Карма: -5 поощрить/наказать
|
Posted: Sat Mar 11, 2006 4:53 am (спустя 7 дней 18 часов 14 минут; написано за 2 минуты 15 секунд)
Post subject:
|
|
Более совершенный вариант функции: Дает возможность либо добавлять цифру перед словом, либо нет в зависимости от значения переменной $withnumber: ================
| Code (php): |
скопировать код в буфер обмена |
FUNCTION declension ($int, $expressions, $withnumber = FALSE){ IF (COUNT ($expressions) < 3) {$expressions[2] = $expressions[1]; }; SETTYPE ($int, 'integer'); IF ($withnumber == TRUE) {$result = $int . ' '; } ELSE {$result = ''; }; $count = $int % 100; IF ($count >= 5 && $count <= 20) {$result .= $expressions[2]; } ELSE { $count = $count % 10; IF ($count == 1) {$result .= $expressions[0]; } ELSEIF ($count >= 2 && $count <= 4) {$result .= $expressions[1]; } ELSE {$result .= $expressions[2]; }; }; RETURN $result; }; |
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Sat Mar 11, 2006 8:55 pm (спустя 16 часов 2 минуты; написано за 1 минуту 2 секунды)
Post subject:
|
|
~Cache~
Ужасный стиль
| Дмитрий Кóтеров wrote: |
|
Возвращает ТОЛЬКО само слово, это удобнее |
Сделал теперь, чтобы можно было втыкать в функцию прямо число вместе с форматированием - как раз для того случая, когда тебе нужно жирным обрамить, или ещё как :). Это ещё удобнее, ИМХО. Ну и + на всякий случай, если нужно, третий параметр, если обрамление уж очень «грязное» :).
|
|
| Back to top |
|
 |
~Cache~
Заглянувший
Joined: 11 Mar 2006
Posts: 11
Карма: -5 поощрить/наказать
|
Posted: Sun Mar 12, 2006 1:54 pm (спустя 16 часов 58 минут; написано за 4 минуты)
Post subject:
|
|
| Юpий Насрeтдинов wrote: |
~Cache~
Ужасный стиль |
Мну устраивает...
Я малость не догоняю, а для чего нужно '%100'
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Sun Mar 12, 2006 6:23 pm (спустя 4 часа 29 минут; написано за 42 секунды)
Post subject:
|
|
| ~Cache~ wrote: |
|
Мну устраивает... |
Я лишь высказал своё мнение. Вы ещё вспомните, что я говорил.
| ~Cache~ wrote: |
|
Я малость не догоняю, а для чего нужно '%100' |
А для чего у Вас вот это:
| ~Cache~ wrote: |
|
$count = $int % 100; |
:)?
|
|
| Back to top |
|
 |
~Cache~
Заглянувший
Joined: 11 Mar 2006
Posts: 11
Карма: -5 поощрить/наказать
|
Posted: Tue Apr 04, 2006 4:05 am (спустя 22 дня 9 часов 41 минуту; написано за 3 минуты 50 секунд)
Post subject:
|
|
| Юpий Насрeтдинов wrote: |
А для чего у Вас вот это:
| ~Cache~ wrote: |
|
$count = $int % 100; |
:)? |
Я только частично отредактировал функцию, сделав ее малость удобней (на тот момент) и оставив основной код.
| Дмитрий Кóтеров wrote: |
| Code (php): |
скопировать код в буфер обмена |
/*...*/ function declension ($int, $expressions) { if (count($expressions) < 3) $expressions[2] = $expressions[1]; settype($int, "integer"); $count = $int % 100; /*...*/ |
|
В связи с чем и был задан вопрос по поводу $count = $int % 100;, для чего нужно это действо ?!
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Sat Apr 08, 2006 2:10 pm (спустя 4 дня 10 часов 4 минуты; написано за 34 секунды)
Post subject:
|
|
| ~Cache~ wrote: |
|
$count = $int % 100;, для чего нужно это действо ?! |
Я Вам рекомендую попытаться понять самому, как это работает (ибо там ничего сложного нету) и ответить самостоятельно на этот вопрос
|
|
| Back to top |
|
 |
Aleks
Guest
Карма: 382 поощрить/наказать
|
Posted: Mon Jun 12, 2006 9:19 pm (спустя 2 месяца 4 дня 7 часов 8 минут; написано за 3 минуты 40 секунд)
Post subject:
|
|
Строго не судите, Php учю самостоятельно(6 месяцев), до этого ничего не имел с програмированием
| Code (php): |
скопировать код в буфер обмена |
/********* Функция возвращает существительное которое стоит после числительного, в правильном формате. $REZahl - числительное $REVar1 - Вариант1 слово при "1" (пример: "Игра")(Одна игра) $REVar2 - Вариант2 слово при "2,3,4" (пример: "Игры")(Две игры) $REVar3 - Вариант3 слово при "5,6,7,8,9" (пример: "Игр") (Пять игр)
пример вызова $slovo = RusEndung($chislo, "Игра", "Игры", "Игр"); ***/function RusEndung ($REZahl= 0, $REVar1, $REVar2, $REVar3){ $RElast = substr ($REZahl, - 1); switch ($RElast){ case 1: $REnd= $REVar1; break; case 2: case 3: case 4: $REnd= $REVar2; break; default: $REnd= $REVar3; break; } if( $REZahl > 9 && substr ($REZahl, - 2, 1)== "1")$REnd= $REVar3; return $REnd; } |
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Mon Jun 12, 2006 11:00 pm (спустя 1 час 41 минуту)
Post subject:
|
|
| ИМХО с числами лучше работать как с числами,а не как со строками:). А так.. Ну, 6 месяцев - уже довольно много, так что можно и посудить ;)
|
|
| Back to top |
|
 |
chin
Участник форума

Joined: 23 Feb 2005
Posts: 312
Карма: 26 поощрить/наказать
Location: Украина, Киев
|
Posted: Wed Jun 14, 2006 8:58 pm (спустя 1 день 21 час 58 минут; написано за 1 минуту 4 секунды)
Post subject:
|
|
| Code (php): |
скопировать код в буфер обмена |
function PluralForm ($n, $form1, $form2, $form5){ $n = abs($n) % 100; $n1 = $n % 10; if ($n > 10 && $n < 20) return $form5; if ($n1 > 1 && $n1 < 5) return $form2; if ($n1 == 1) return $form1; return $form5; } |
Пример использования:
| Code (php): |
скопировать код в буфер обмена |
PluralForm(1,"минута","минуты","минут"); // минута PluralForm(2,"минута","минуты","минут"); // минуты PluralForm(5,"минута","минуты","минут"); // минут |
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Wed Jun 14, 2006 9:15 pm (спустя 16 минут)
Post subject:
|
|
| Интересно, в чем смысл от того, что вы тут постите одну и ту же функцию в разных вариациях:)
|
|
| Back to top |
|
 |
chin
Участник форума

Joined: 23 Feb 2005
Posts: 312
Карма: 26 поощрить/наказать
Location: Украина, Киев
|
Posted: Wed Jun 14, 2006 9:42 pm (спустя 26 минут; написано за 42 секунды)
Post subject:
|
|
| Юpий Насрeтдинов wrote: |
|
Интересно, в чем смысл от того, что вы тут постите одну и ту же функцию в разных вариациях:) |
Эта короче, быстрее и без лишних наворотов... ИМХО.
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Wed Jun 14, 2006 9:57 pm (спустя 14 минут; написано за 33 секунды)
Post subject:
|
|
chin
Эти навороты отнюдь не лишние (а выработаны годами :)!). А вот насчёт скорости - это уж точно экономия на спичках.
|
|
| Back to top |
|
 |
chin
Участник форума

Joined: 23 Feb 2005
Posts: 312
Карма: 26 поощрить/наказать
Location: Украина, Киев
|
Posted: Wed Jun 14, 2006 10:25 pm (спустя 27 минут; написано за 50 секунд)
Post subject:
|
|
| Юpий Насрeтдинов wrote: |
|
Эти навороты отнюдь не лишние (а выработаны годами :)!). А вот насчёт скорости - это уж точно экономия на спичках. |
Есть такое восточное искусство, называется "Каму-шо". Так вот мне этот вариант больше подходит. Против Вашего ничего не имею (:
|
|
| Back to top |
|
 |
Rumata
Профессионал

Joined: 17 Aug 2003
Posts: 1850
Карма: 186 поощрить/наказать
|
|
| Back to top |
|
 |
ABTOP
Заглянувший
Joined: 01 Dec 2007
Posts: 14
Карма: -1 поощрить/наказать
|
Posted: Sat Dec 01, 2007 7:34 am (спустя 1 год 4 месяца 19 дней 12 часов 23 минуты; написано за 1 минуту 37 секунд)
Post subject:
|
|
| Юрий Насретдинов wrote: |
|
Эти навороты отнюдь не лишние (а выработаны годами :)!). А вот насчёт скорости - это уж точно экономия на спичках. |
Нельзя ли привести преимущества того или иного скропта перед другими?
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Sun Dec 02, 2007 1:23 am (спустя 17 часов 49 минут; написано за 2 минуты 44 секунды)
Post subject:
|
|
| ABTOP wrote: |
|
Нельзя ли привести преимущества того или иного скропта перед другими? |
- поддержка склонений как на английском, так и на русском языках
- возможность подавать на вход «грязное» число, например, завёрнутое в теги <b> ... </b>.
- более трёх лет выдержки, и использование этой функции на форуме :), что доказывает её удобство и применимость к реальным задачам
- корректное склонение отрицательных чисел
Last edited by Юрий Насретдинов on Thu Sep 11, 2008 11:29 am; edited 1 time in total
|
|
| Back to top |
|
 |
ABTOP
Заглянувший
Joined: 01 Dec 2007
Posts: 14
Карма: -1 поощрить/наказать
|
Posted: Sun Dec 02, 2007 10:16 pm (спустя 20 часов 53 минуты; написано за 2 минуты 35 секунд)
Post subject:
|
|
| Спасибо за ответ. Я хочу поставить такую функцию себе на phpbb форум - вынужденная русская неграмотность англоязычных модификаций порядком приелась - и, если силёнок хватит, может быть даже выделить ето в самостоятельный MOD. Если авторы не возражают, конечно...
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Mon Dec 03, 2007 12:24 am (спустя 2 часа 8 минут; написано за 5 секунд)
Post subject:
|
|
ABTOP
Да пожалуйста, я даже буду рад :).
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Sun Sep 07, 2008 9:43 pm (спустя 9 месяцев 4 дня 21 час 18 минут; написано за 2 минуты 3 секунды)
Post subject:
|
|
Добавил небольшое исправление в свою функцию: теперь можно в качестве вариантов склонения слова указывать не массив, а строчку, разделенную пробелами:
| Code (php): |
скопировать код в буфер обмена |
echo 'динозавр съел целых '.declension ('<i>25</i>', 'бублик бублика бубликов'); // выведет динозавр съел целых <i>25</i> бубликов |
Такой синтаксис мне кажется более удобным и менее громоздким.
|
|
| Back to top |
|
 |
Даниил Б.
Заглянувший
Joined: 16 Jul 2003
Posts: 3
Карма: 0 поощрить/наказать
Location: Питер
|
Posted: Tue Feb 24, 2009 4:30 am (спустя 5 месяцев 16 дней 6 часов 47 минут; написано за 6 секунд)
Post subject:
|
|
Юрий Насретдинов
Есть предложение расширить функцию onlyword. Допустим, работаем с количеством комментариев. В случае, если $digit равно нулю, в некоторых случаях уместно написать «комментариев нет», в некоторых — «нет комментариев», а в некоторых — «никто не оставил комментария». В общем, было бы хорошо, если б можно было ввести четвертую строку, которая (опционально) возвращалась бы функций в случае нуля в $digit. Почему я не сделал этого сам? Потому что не программист, просто искал функию склонения для свого сайта, и набрел на эту страничку. :)
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Tue Feb 24, 2009 1:38 pm (спустя 9 часов 7 минут; написано за 1 минуту 7 секунд)
Post subject:
|
|
Даниил Белый
У меня, кстати, был вариант с такой функциональностью. Но я от этого отказался, поскольку лично мне это не пригодилось ни разу.
|
|
| Back to top |
|
 |
Даниил Б.
Заглянувший
Joined: 16 Jul 2003
Posts: 3
Карма: 0 поощрить/наказать
Location: Питер
|
Posted: Tue Feb 24, 2009 3:57 pm (спустя 2 часа 18 минут; написано за 6 минут 8 секунд)
Post subject:
|
|
| Юрий Насретдинов wrote: |
|
У меня, кстати, был вариант с такой функциональностью. Но я от этого отказался, поскольку лично мне это не пригодилось ни разу. |
Да? Тогда, может быть, на практике это действительно никому не нужно. В моем конкретном случае обработка нулевого значения также происходит вне функции.
|
|
| Back to top |
|
 |
Александр Птахин
Заглянувший
Joined: 26 Jun 2006
Posts: 5
Карма: 0 поощрить/наказать
|
Posted: Tue Feb 24, 2009 10:16 pm (спустя 6 часов 19 минут; написано за 2 минуты 21 секунду)
Post subject:
|
|
Даниил Белый, Юрий Насретдинов, Возможно это выглядит странно, но вариант с нулём был :) :
| Code (php): |
скопировать код в буфер обмена |
<?=($QuantityNewSolves)? $QuantityNewSolves . " ": "" ?><?=PluralFormNull( $QuantityNewSolves, "Нет новых решений", "новое решение", "новых решения", "новых решений" )?> |
Сейчас мне, правда, кажется, что с обычным if было бы более читаемо.
| Code (php): |
скопировать код в буфер обмена |
<? if( $QuantityNewSolves ) { ?> <?=$QuantityNewSolves?> <?=PluralForm( $QuantityNewSolves, "новое решение", "новых решения", "новых решений" )?> <? } else { ?> "Нет новых решений" <? } ?> |
Хотя, посмотрев на "высоту" кода, я сомневаюсь :).
|
|
| Back to top |
|
 |
Владимир Твердохлебов
Guest
Карма: 382 поощрить/наказать
|
Posted: Tue Apr 14, 2009 8:21 am (спустя 1 месяц 17 дней 10 часов 4 минуты; написано за 54 секунды)
Post subject:
|
|
Вот что у меня получилось (возвращает только слово):
| Code (php): |
скопировать код в буфер обмена |
function declension ($num, $str){ $exp = explode(',', $str); $num -= ($num < 0) ? $num* 2 : 0; $dig = ($num > 20) ? substr($num, - 1) : $num; return trim((($dig == 1) ? $exp[1] : (($dig > 4 || $dig < 1) ? $exp[0] : $exp[2]))); }// testfor($i=- 29; $i<= 29; $i++ ){ print $i . ' ' . declension ($i, 'ответов, ответ, ответа') . '<br/>'; } |
|
|
| Back to top |
|
 |
Юрий Насретдинов
Модератор

Joined: 13 Mar 2003
Posts: 8644
Карма: 212 поощрить/наказать
Location: 007 495
|
Posted: Tue Apr 14, 2009 8:56 am (спустя 35 минут; написано за 38 секунд)
Post subject:
|
|
Владимир Твердохлебов
А 113 должно быть «ответов» или «ответа»? Не надо изобретать велосипед, а уж тем более с substr() баловаться :)
|
|
| Back to top |
|
 |
Guest
Карма: 382 поощрить/наказать
|
Posted: Tue Apr 14, 2009 7:57 pm (спустя 11 часов 23 секунды; написано за 1 минуту 55 секунд)
Post subject:
|
|
Юрий Насретдинов
спасибо, исправил :) В substr() не вижу ничего зазорного, ибо написано: "тип переменной определяется по контексту, в котором она используется."
| Code (php): |
скопировать код в буфер обмена |
// исправленный вариантfunction declension ($num, $str){ $exp = explode(',', $str); $num = (($num < 0) ? $num- $num* 2 : $num)% 100; $dig = ($num > 20) ? $num% 10 : $num; return trim((($dig == 1) ? $exp[1] : (($dig > 4 || $dig < 1) ? $exp[0] : $exp[2]))); } |
|
|
| Back to top |
|
 |
KIVagant
Guest
Карма: 382 поощрить/наказать
|
Posted: Thu Oct 29, 2009 11:10 pm (спустя 6 месяцев 15 дней 3 часа 13 минут; написано за 13 секунд)
Post subject:
|
|
| Спасибо.
|
|
| Back to top |
|
 |
|