Апр 01 2013

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

Категория: PHPgugglegum @ 17:36

Я просто положу это здесь, т.к. эта функция практически без изменений у меня качует из проекта в проект.


/**
 * Склонение числительных (для русского языка)
 *
 * Принимает число и выбирает соответствующее склонение числительного. Всего 3 варианта, которые
 * соответствуют числам 1, 2 и 5.
 *
 * @param int $number
 * @param string $one
 * @param string $two
 * @param string $five
 * @return string
 */
$plural = function($number, $one, $two, $five) {
	if (($number - $number % 10) % 100 != 10) {
		if ($number % 10 == 1) {
			$result = $one;
		} elseif ($number % 10 >= 2 && $number % 10 <= 4) {
			$result = $two;
		} else {
			$result = $five;
		}
	} else {
		$result = $five;
	}
	return $result;
};

Эта функция часто пригождается, когда нужно вывести правильное окончание у слов, связанных с количественным числительным. Например, нам нужно вывести кол-во слов. Мы пишем в шаблоне:

echo "Найдено " . $n . " слов";

Но $n может быть равно 1, тогда правильнее писать “слово“. А если слов, например, 23, то правильно писать “слова“. Данная функция реализует универсальный подход к решению данной задачи. Вы пишите:

echo "Найдено " . $n . " " . $plural($n, "слово", "слова", "слов");

Здесь функция $plural() принимает первым параметром число, по которому мы выбираем окончание, а тремя следующими параметрами принимает словоформы некоторого слова, которое нам нужно поставить с правильным окончанием, соответствующие числительным “один”, “два” и “пять” соответственно. Для всех остальных числительных (0, 7, 11, 22, 159) правильной будет одна из этих трёх форм и выбор нужной формы одинаков для всех существительных.