О web-разработке
и даже немного больше...

Склонение слова, в зависимости от числа стоящего перед ним

В проектах частенько встречаются шаблонные фразы и предложения, где динамически могут подставляться числа в строке. Существует такая проблема, что последующее слово за динамически-меняющимся числом, частенько нуждается в склонении, т.е. к примеру:
1 яблоко, 2 яблока, 10 яблок
Нужно было найти универсальное решение, чтобы можно было использовать во всех подобных ситуациях. После чего я решил написать функцию, которая справляется с этой задачей так как надо. То, что получилось, решил выложить здесь.

Код функции: (UPDATED!)

# склонение слов в зависимости от числа
function declension_words($n,$words){
	return ($words[($n=($n=$n%100)>19?($n%10):$n)==1?0 : (($n>1&&$n<=4)?1:2)]);
}

Функции передаются два параметра:
$num – число, опираясь на которое необходимо склонять последующее слово
$arWords – одномерный массив, из трех вариантов склонения оперируемого слова.

Для лучшего понимания происходящего рассмотрим пример, из трёх предложений:
1. Мне нужно 3 яблока
2. У меня 3 кружки
3. У меня получилось 3 комбинации

Теперь представьте если мы меняем цифру 3 в предложении на допустим 10, получается так:
1. Мне нужно 10 яблок
2. У меня 10 кружек
3. У меня получилось 10 комбинаций
Как можно заметить последние слова в предложении изменились.

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

# слова расположены строго по порядку, в размере 3-х
$arWords = array('яблоко','яблока','яблок');
$arWords2 = array('кружка','кружки','кружек');
$arWords3 = array('комбинация','комбинации','комбинаций');

# произвольное число
$num = 3;

# обращаемся к функции
echo 'Мне нужно '.$num.' '.declension_words($num,$arWords).'<br>';
echo 'У меня '.$num.' '.declension_words($num,$arWords2).'<br>';
echo 'У меня получилось '.$num.' '.declension_words($num,$arWords3).'<br>';

Для того чтобы узнать какие слова следует подставить в массиве для своих случаев, вы можете изначально просклонять в голове по числам 1, 2, 5.
Т.е. к примеру, есть такое предложение:
1. На ваш вопрос существует 1 ответ
2. На ваш вопрос существует 2 ответа
3. На ваш вопрос существует 5 ответов

В итоге получается такой массив:

$arWords = array('ответ','ответа','ответов');

На этом всё, надеюсь, пост оказался для вас полезным. Кстати так же рекомендую к просмотру статью — вывод даты в строковом формате.

Опубликован: 10.11.2014 г.

См. также:

Редакторы кода для PHP
Как просмотреть время загрузки страницы в PHP?
Генерация QR-кода в PHP
Загрузка файлов на сервер посредством Ajax
Импорт записей из Excel в WordPress
Парсинг XML в PHP
Установка IonCube на XAMPP
Создание PDF файлов в PHP

Комментарии

  1. Олег пишет:

    мой вариант)

    function numWord($num,$words) {
    return ($words[($n=($n=$n%100)>19?($n%10):$n)==1?0 : (($n>1&&$n<=4)?1:2)]);
    }

    1. htmaker пишет:

      Спасибо! Воспользовался твоим вариантом, т.к. в моем была найдена ошибка!

  2. Евгений пишет:

    Спасибо. То, что искал)

  3. Олег пишет:

    Сделайте $num = 111
    И вы поймете, что функция не работает

    1. htmaker пишет:

      Отлично, спасибо!

Добавить комментарий для Евгений Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта