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

Передо мной встала такая задача, когда я занимался интернет-магазином 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.

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

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

Комментирование этого поста более не доступно.
  • Сергей 18 июня 2014 #

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

    • Миша 18 июня 2014 #

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

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

    • Миша 18 июня 2014 #

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

  • Макс 30 сентября 2015 #

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