Склонение слов в зависимости от стоящих рядом с ними цифр (существительных после числительных)

Передо мной встала такая задача, когда я занимался интернет-магазином Blue Jay и мне требовалось вывести общее количество товаров в категориях. Мне очень хотелось решить поставленную задачу качественно, то есть, чтобы выводилось «1 товар», «2 товарА», «5 товарОВ», а не «1 товаров» и «2 товаров».

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

Да уж, тут англичанам хорошо, у них если один товар, то «product», а если не один, то «products». В русском же языке есть три формы множественного числа, да ещё и слово постоянно склоняется в зависимости от чисел, которые стоят перед ним.

Поэтому передо мной встал выбор — либо вообще избавиться от надписи с общим числом товаров, либо как-то упростить её, либо добавить функцию, которая будет склонять слова — на третьем варианте я и остановился:

/*
 * $num число, от которого будет зависеть форма слова
 * $form_for_1 первая форма слова, например Товар
 * $form_for_2 вторая форма слова - Товара
 * $form_for_5 третья форма множественного числа слова - Товаров
 */
function true_wordform($num, $form_for_1, $form_for_2, $form_for_5){
	$num = abs($num) % 100; // берем число по модулю и сбрасываем сотни (делим на 100, а остаток присваиваем переменной $num)
	$num_x = $num % 10; // сбрасываем десятки и записываем в новую переменную
	if ($num > 10 && $num < 20) // если число принадлежит отрезку [11;19]
		return $form_for_5;
	if ($num_x > 1 && $num_x < 5) // иначе если число оканчивается на 2,3,4
		return $form_for_2;
	if ($num_x == 1) // иначе если оканчивается на 1
		return $form_for_1;
	return $form_for_5;
}

Если вы хотите использовать эту функцию в WordPress, то можете вставить её в файл functions.php — вы можете найти его в папке с темой.

Всё довольно просто. Теперь, когда я расписал, как это работает, приведу пример:

$max_product = 5; // число, эта переменная может задаваться через какую-то другую функцию или доставаться из базы - неважно
echo $max_product . ' ' . true_wordform($max_product, 'товар', 'товара', 'товаров'); // в результате получится "5 товаров"

Читайте также о том, как реализовать склонение слов на JavaScript.

Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

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

  • Сергей18 июня 2014 в 16:06 #

    Миша, спасибо за статьи, часто обращаюсь к твоему блогу за помощью, нахожу его интересным и весьма полезным. Хотелось бы узнать как делать pop-up как у тебя на сайте, тот, что с инфой "об авторе". Если не будет сложно хотелось вы увидеть статью по валидной верстке, спасибо

    • Миша18 июня 2014 в 18:06 #

      Привет!
      Да, статью по верстке нужно уже давно, но там работы очень много по ней, напишу со временем.

      Что касается pop-up:
      1) блок должен иметь position:fixed; right:-ШИРИНА_БЛОКА; ну и CSS transition.
      2) при прокрутке через JS меняем CSS-свойство right на положительное число, в итоге блок выезжает :)

    • Миша18 июня 2014 в 18:06 #

      У меня всё это в коде сайта наглядно можно посмотреть, файлы v7.css и jcore.js.

  • Макс30 сентября 2015 в 11:09 #

    спасибо чувак!

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

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • alex morozov: Добрый вечер! у меня возникла следующая проблема. Я делаю фотоальбомы, чтобы они выглядели "как в контакте". Так вот, та...

  • Vladislav: Если эту муть убрать, то исчезает меню, и появляется описание под миниатюрами, которого не должно быть, как вы видите, я...

  • Миша: Либо размеры изображений вам помогут, либо CSS. И строку 14 гляньте, там муть какая-то.

  • Vladislav: Подправил имеющийся у меня код, по вашим рекомендациям, миниатюры начали отображаться, но они стали очень огромными, что...

  • Миша: Лишь предложил решение. Думаю можно нашаманить и так, чтобы чисто для рубрик было, не уверен только, что обойдётся без и...