Склонение числительных на PHP

Для красоты вывода информации, иногда приходится склонять числительные.

Например: 1 комментарий, 2 комментария, 10 комментариев, 101 комментарий, 151 комментарий, 511 комментариев, 777 комментариев, 1001 комментарий и т.д.

Функция склонения числительных

Пишем простую функцию string numberof(int numberof, string value, array suffix)

<?php /** * Склонение числительныхфывфывфывф * @param int $numberof — склоняемое число * @param string $value — первая часть слова (можно назвать корнем) * @param array $suffix — массив возможных окончаний слов * @return string * */ function numberof($numberof, $value, $suffix) { // не будем склонять отрицательные числа $numberof = abs($numberof); $keys = array(2, 0, 1, 1, 1, 2); $mod = $numberof % 100; $suffix_key = $mod > 4 && $mod < 20 ? 2 : $keys[min($mod%10, 5)]; return $value . $suffix[$suffix_key]; } // значения $values = array(1, 2, 10, 101, 151, 511, 777, 1001); // перебираем массив foreach ($values as $number) { echo $number.' '; // получаем нужное склонение echo numberof($number, 'комментари', array('й', 'я', 'ев')); echo '<br>'; } ?>

Результат

На экране вы увидите:

1 комментарий
2 комментария
10 комментариев
101 комментарий
151 комментарий
511 комментариев
777 комментариев
1001 комментарий

Разъяснение по слову «комментарий»

Слово комментарий может принимать всего 3 значения: комментари(й), комментари(я), комментари(ев).

Алгоритм

  1. Число заканчивающееся на 1 (1, 21, 31, 101, 1001, 1161 и т.д.), исключение 11, получает первое окончание: комментари(й)
  2. Далее все числа в диапазоне от 2 до 4 (2-4, 22-24, 32-34, 102-104, 1122-1124), исключение 12-14, получает второе окончание: комментари(я)
  3. Все остальные числа получают значение комментари(ев)

Примечание

P.S.: Реализовать алгоритм можно разными способами, но, способ показанный выше, мне кажется, самый короткий. Можно обойтись двумя строками, только читаемость кода ухудшится.

Категории

ПрограммированиеPHP

Читайте также

Комментарии

Артём Фёдоров

Спасибо. Поправил!

Ответить
Антон Терехов

Хорошая, ёмкая реализация. Но падает при отрицательных значениях.
$numberof = abs($numberof);

Ответить