Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

Склонения слов на PHP

#php #ms_word


Есть такая небольшая статистика

"N" Человек просят сейчас помощь!

if (n == 1) => "1 человек просит сейчас помощь"  
elseif ($n == 2) => "2 человекА просЯт сейчас помощь"


и так далее.

Как это сделать?
    


Ответы

Ответ 1



function declOfNum($num, $titles) { $cases = array(2, 0, 1, 1, 1, 2); return $num . " " . $titles[($num % 100 > 4 && $num % 100 < 20) ? 2 : $cases[min($num % 10, 5)]]; } echo declOfNum(5, array('человек просит', 'человека просят', 'человек просят'));

Ответ 2



Вот тут люди обновляют правила для разных языков: Language Plural Rules. Для русского языка: one → n mod 10 is 1 and n mod 100 is not 11; few → n mod 10 in 2..4 and n mod 100 not in 12..14; many → n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14; other → everything else Таким образом: function pluralCategory($count) { $mod10 = $count % 10; $mod100 = $count % 100; if (is_int($count) && $mod10 == 1 && $mod100 != 11) { return 'one'; } elseif (($mod10 > 1 && $mod10 < 5) && ($mod100 < 12 || $mod100 > 14)) { return 'few'; } elseif ($mod10 == 0 || ($mod10 > 4 && $mod10 < 10) || ($mod100 > 10 && $mod100 < 15)) { return 'many'; } else { return 'other'; } } Само собой, в ответе будет только категория. Для слова "человек" массив соответствий будет таким: one → человек few → человека many → человек other → человека Демо: $word = array( 'one' => 'человек', 'few' => 'человека', 'many' => 'человек', 'other' => 'человека', ); for ($i = 1; $i < 500; $i++) { echo $i.' '.$word[pluralCategory($i)].'
'; }

Ответ 3



Вариант для данного случая избыточен, но он подходит и для других случаев, когда у слова не две, а три формы: for( $n = 1; $n < 4096; $n++ ) { $plural = ( $n % 10 == 1 && $n % 100 != 11 ? 'человек' : ( $n % 10 >= 2 && $n % 10 <= 4 && ( $n % 100 < 10 || $n % 100 >= 20 ) ? 'человека' : 'человек' ) ); print "$n $plural\n"; }

Ответ 4



Отмечусь тоже. Скрестил алгоритм @lampa со своими шаблонами. Мне кажется так удобнее. Кода на много строк из-за свободной записи регулярного выражения, поэтому просто дам ссылку на реализацию с тестами: http://ideone.com/XQgK2g В функцию sklonit надо просто передать текст содержащий сколько угодно шаблонов: // шаблон 1 [число:начало(конец1,конец2,конец3)] // начало+конец [2:яблок(о,а,)] // яблока // шаблон 2 число[разделитель:начало(конец1,конец2,конец3)] // число+разделитель+начало+конец 2[ :яблок(о,а,)] // 2 яблока При этом если во втором шаблоне разделитель это число, то считается, что это шаблон первого типа, то есть 1[2:яблок(о,а,)] // 1яблока , а не 12яблоко, если воспринимать это как шаблон 2

Ответ 5



А можно воспользоваться нормальной библиотекой - https://github.com/wapmorgan/Morphos (http://morphos.io) , которая сама поймёт как нужно склонять любое слово. Вы просто пишете morphos\Russian\pluralize(10, 'комментарий') и получаете "10 комментариев"

Комментариев нет:

Отправить комментарий