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

В интернет магазинах, CRM и других сервисах для «правильности» есть необходимость склонять существительных после чисел или как это еще называют – плюрализация, например: 1 товар, 2 товара, 5 товаров.

Реализовать такой вывод можно с помощью функции:

/**
 * Склонение существительных после числительных.
 * 
 * @param string $value Значение
 * @param array $words Массив вариантов, например: array('товар', 'товара', 'товаров')
 * @param bool $show Включает значение $value в результирующею строку
 * @return string
 */
function num_word($value, $words, $show = true) 
{
	$num = $value % 100;
	if ($num > 19) { 
		$num = $num % 10; 
	}
	
	$out = ($show) ?  $value . ' ' : '';
	switch ($num) {
		case 1:  $out .= $words[0]; break;
		case 2: 
		case 3: 
		case 4:  $out .= $words[1]; break;
		default: $out .= $words[2]; break;
	}
	
	return $out;
}
PHP

Параметр $words – массив, в котором:

  • первый элемент задает текст для единичных значений,
  • второй для значений с 2-х до 4-х,
  • третий для всех остальных.

Например:

echo num_word(1, array('рубль', 'рубля', 'рублей')) . '<br>';
echo num_word(3, array('рубль', 'рубля', 'рублей')) . '<br>';
echo num_word(9, array('рубль', 'рубля', 'рублей')) . '<br>';
PHP
1 рубль
3 рубля
9 рублей
В продолжении самые часто используемые единицы измерения:
1
echo num_word($value, array('товар', 'товара', 'товаров');
echo num_word($value, array('штука', 'штуки', 'штук');
echo num_word($value, array('упаковка', 'упаковки', 'упаковок');
echo num_word($value, array('коробка', 'коробки', 'коробок');
echo num_word($value, array('пачка', 'пачки', 'пачек');
echo num_word($value, array('ящик', 'ящика', 'ящиков');
echo num_word($value, array('комплект', 'комплекта', 'комплектов');
echo num_word($value, array('экземпляр', 'экземпляра', 'экземпляров');
echo num_word($value, array('рулон', 'рулона', 'рулонов');
echo num_word($value, array('лист', 'листа', 'листов');
echo num_word($value, array('погонный метр', 'погонных метра', 'погонных метров'));
PHP
2
echo num_word($value, array('процент', 'процента', 'процентов'));
echo num_word($value, array('рубль', 'рубля', 'рублей'));
echo num_word($value, array('доллар', 'доллара', 'долларов'));
echo num_word($value, array('условная единица', 'условные единицы', 'условных единиц'));
PHP
3
echo num_word($value, array('тонна', 'тонны', 'тонн'));
echo num_word($value, array('центнер', 'центнера', 'центнеров'));
echo num_word($value, array('килограмм', 'килограмма', 'килограммов'));
echo num_word($value, array('грамм', 'грамма', 'граммов'));
echo num_word($value, array('миллиграмм', 'миллиграмма', 'миллиграммов'));
PHP
4
echo num_word($value, array('километр', 'километра', 'километров'));
echo num_word($value, array('метр', 'метра', 'метров'));
echo num_word($value, array('сантиметр', 'сантиметра', 'сантиметров'));
echo num_word($value, array('миллиметр', 'миллиметра', 'миллиметров'));
PHP
5
echo num_word($value, array('куб', 'куба', 'кубов'));
echo num_word($value, array('литр', 'литра', 'литров'));
echo num_word($value, array('миллилитр', 'миллилитра', 'миллилитров'));
PHP
6
echo num_word($value, array('гектар', 'гектара', 'гектаров'));
echo num_word($value, array('акр', 'акра', 'акров'));
echo num_word($value, array('сотка', 'сотки', 'соток'));
echo num_word($value, array('квадратный метр', 'квадратных метра', 'квадратных метров'));
PHP
7
echo num_word($value, array('год', 'года', 'лет'));
echo num_word($value, array('месяц', 'месяца', 'месяцев'));
echo num_word($value, array('день', 'дня', 'дней'));
echo num_word($value, array('сутки', 'суток', 'суток'));
echo num_word($value, array('час', 'часа', 'часов'));
echo num_word($value, array('минута', 'минуты', 'минут'));
echo num_word($value, array('секунда', 'секунды', 'секунд'));
echo num_word($value, array('микросекунда', 'микросекунды', 'микросекунд'));
echo num_word($value, array('миллисекунда', 'миллисекунды', 'миллисекунд'));
PHP
8
echo num_word($value, array('оборот в минуту', 'оборотов в минуту', 'оборотов в минуту'));
echo num_word($value, array('километр в час', 'километра в час', 'километров в час'));
echo num_word($value, array('лошадиная сила', 'лошадиные силы', 'лошадиных сил'));
echo num_word($value, array('градус', 'градуса', 'градусов'));
echo num_word($value, array('калория', 'калории', 'калорий'));
PHP
9
echo num_word($value, array('параграф', 'параграфа', 'параграфов'));
echo num_word($value, array('предложение', 'предложения', 'предложений'));
echo num_word($value, array('слово', 'слова', 'слов'));
echo num_word($value, array('знак', 'знака', 'знаков'));
echo num_word($value, array('символ', 'символа', 'символов'));
PHP
24.08.2018, обновлено 17.09.2020
23083
Предыдущая запись Шаблонизатор Smarty

Комментарии 1

Артем Бурлака Артем Бурлака
30 июня 2020 в 13:16
Такая же функция, только запись короче
// склонение числительных (array('товар', 'товара', 'товаров'))
function num_declension ($number, $titles) {
	$abs = abs($number);
	$cases = array (2, 0, 1, 1, 1, 2);
	return $number." ".$titles[ ($abs%100 > 4 && $abs %100 < 20) ? 2 : $cases[min($abs%10, 5)] ];
}

, чтобы добавить комментарий.

Другие публикации

Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
65772
+33
Поиск похожих текстов в базе данных MySQL + PHP
Один из вариантов поиска похожих статей в базе данных основан на схождении слов в двух текстах.
7207
+6
Работа с JSON в PHP
JSON (JavaScript Object Notation) – текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}. Значение может быть массивом, числом, строкой и...
113968
+14
Календарь на PHP
PHP-класс для вывода календаря на месяц, год или любой другой интервал с возможностью выделить отдельные даты и вывести к ним подсказки.
30877
+10
Очистка данных из форм в PHP
Для предотвращения XSS, SQL-инъекций и других атак, данные полученные из форм нужно чистить. Простое экранирования кавычек не достаточно, нужен комплексный подход по типу данных.
11701
+6
Обработка изображений в PHP
Библиотека GD дает возможность работать с изображениями в PHP. Далее представлены примеры как изменить размер, вырезать часть изображения и т.д.
58137
+14