Согласование слов с числительными в PHP и JavaScript

Пожалуй самая лаконичная и удобная функция для выбора верной формы слов.

PHP Вариант:

<?php
/**
 * Функция склонения числительных в русском языке
 *
 * @param int    $number Число которое нужно просклонять
 * @param array  $titles Массив слов для склонения
 * @return string
 **/
function declOfNum($number, $titles)
{
    $cases = array (2, 0, 1, 1, 1, 2);
    return $number." ".$titles[ ($number%100 > 4 && $number %100 < 20) ? 2 : $cases[min($number%10, 5)] ];
}
?>

Пример использования:

<?php
echo 'Я знаю '.declOfNum(5, array('иностранный язык', 'иностранных языка', 'иностранных языков'));
?>

Ее вариант для применения в Javascript:

function declOfNum(number, titles)
{
    cases = [2, 0, 1, 1, 1, 2];
    return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];
}

И, также, пример использования:

$('#mess').html(declOfNum(foundedCount, ['Найдена ', 'Найдено ', 'Найдено ']) + foundedCount + declOfNum(foundedCount, [' модель', ' модели', ' моделей']);

Как видно из javascript-примера иногда удобнее не выводить само числительное в функции, так как склонять приходится не только слова после цифры.

Оригинальный источник

  • Webdarwin

    Очень помог, спасибо.

  • RmRevin

    В источнике функция была дописана как раз для вариантов «Найдено N моделей». Думаю и на JS можно портировать.

  • impostor

    Бред! тут не склоняются числительные, вы вообще знаете что такое числительное?

    как ваша функция будет выводить вот такие варианты:

    1. У меня пять книг и четыре журнала.

    2. У меня больше пяти книг и около четырех журналов.

    3. Я располагаю пятью книгами и четырьмя журналами.

    • Кир

      Идиот, это только для цифр.

      • Александр

        Тогда это не «склонение числительных», а «согласование слов с числительными».

        Склонение — изменение формы слова при употреблении его в различных падежах и числах (единственное или множественное число).

        Склонение числительных подразумевает склонение записанного прописью числа.

        Так что название топика не соответствует его содержанию.