Функция склонения слов после чисел (PHP, JS)

Функция склонения слов после чисел (PHP, JS)

Часто возникает необходимость отображать число с соответствующим ему словом. В русском языке окончание этого слова зависит от указанного числа. Например, "1 день", "2 дня", "5 дней". Как видно, форма слова меняется в зависимости от числа.

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

Функция для склонения слов после числа (PHP)

Вот пример универсальной функции для склонения слов на PHP:

/**
 * Склонение слова после числа.
 *
 *     // Примеры использования:
 *     num_decline( $num, 'книга,книги,книг' )
 *     num_decline( $num, 'book,books' )
 *     num_decline( $num, [ 'книга','книги','книг' ] )
 *     num_decline( $num, [ 'book','books' ] )
 *
 * @param int|string   $number       Число, перед которым будет слово. Вы можете использовать HTML теги.
 * @param string|array $titles       Варианты слов для чисел.
 * @param bool         $show_number  Установите в false, если не хотите выводить само число.
 *
 * @return string Например: 1 книга, 2 книги, 10 книг.
 *
 * @version 3.2
 */
function num_decline( $number, $titles, $show_number = true ): string {

    if( is_string( $titles ) ){
        $titles = preg_split( '/, */', $titles );
    }

    // если указаны 2 элемента
    if( empty( $titles[2] ) ){
        $titles[2] = $titles[1];
    }

    $cases = [ 2, 0, 1, 1, 1, 2 ];

    $intnum = abs( (float) strip_tags( $number ) );
    $intnum = (int) round( $intnum );

    $title_index = ( $intnum % 100 > 4 && $intnum % 100 < 20 )
        ? 2
        : $cases[ min( $intnum % 10, 5 ) ];

    return ( $show_number ? "$number " : '' ) . $titles[ $title_index ];
}

Пример использования функции

Функция позволяет передавать параметры различными способами. Вот несколько примеров:

echo num_decline( 4, 'книга, книги, книг' );     // 4 книги
echo num_decline( 5, ['кни��а','книги','книг'] ); // 5 книг
echo num_decline( 4, 'книга, книги, книг', 0 );  // книги

Выводим склонённый текст до и после числа

$num = 23;
echo sprintf( "%s $num %s",
    num_decline( $num, 'Опубликован,Опубликовано', 0 ),
    num_decline( $num, 'комментарий,комментария,комментариев', 0 )
);
// Опубликовано 23 комментария

Функция для склонения слов после чисел (JS)

Теперь давайте рассмотрим аналогичную функцию на JavaScript.

/**
 * Склонение слова после числа.
 *
 *     // Примеры использования:
 *     num_decline( num, 'книга,книги,книг' )
 *     num_decline( num, 'book,books' )
 *     num_decline( num, [ 'книга','книги','книг' ] )
 *     num_decline( num, [ 'book','books' ] )
 *
 * @param {int|string}   number       Число, после которого будет слово. Можно использовать HTML теги.
 * @param {string|array} titles       Варианты склонений или первое слово для чисел 1.
 * @param {boolean}      show_number  Укажите false, если не хотите выводить само число.
 *
 * @return string Например: 1 книга, 2 книги, 10 книг.
 *
 * @version 3.1
 */
function num_decline( number, titles, show_number = true ){

    if( typeof titles === 'string' ){
        titles = titles.split( /, */ );
    }

    // если указаны 2 элемента
    if( typeof titles[2] === 'undefined' ){
        titles[2] = titles[1];
    }

    const cases = [ 2, 0, 1, 1, 1, 2 ];

    // удаляем HTML теги
    const intnum = Math.abs( parseInt( ${number}.replace(/]+>/gi, '') ) );

    let title_index = ( intnum % 100 > 4 && intnum % 100 < 20 )
        ? 2
        : cases[ Math.min( intnum % 10, 5 ) ];

    return ( show_number ? ${number}  : '' ) + titles[ title_index ];
}

Сокращённая версия

Вот более короткая версия функции:

function numDecline( n, titles ) {
    return titles[ 1 === n % 10 && 11 !== n % 100 ? 0 : 2 <= n % 10 && 4 >= n % 10 && ( 10 > n % 100 || 20 <= n % 100 ) ? 1 : 2 ];
}

// Пример использования
numDecline( 1, ['книга', 'книги', 'книг'] );

Используйте эти функции, чтобы правильно отображать числа с учетом склонения слов в своем проекте на PHP или JavaScript.

Leave a Reply

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