WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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

Мне нужна функция которая бы склоняла слова, которые идут после числа. Например: 1 комментарий и 2 комментария.

Желательно самый простой и универсальный вариант склонение слов после числительного.

П.С. В сети много примеров таких функций, мне интересно а какую используешь ты (Тимур).

1
Danya
3.3 года назад 50
  • 1
    Kama7297

    Немного дополненный вариант блуждающей по сети функции.

    /**
     * Склонение слова после числа.
     *
     * Примеры вызова:
     * num_decline( $num, 'книга,книги,книг' )
     * num_decline( $num, [ 'книга','книги','книг' ] )
     * num_decline( $num, 'книга', 'книги', 'книг' )
     * num_decline( $num, 'книга', 'книг' )
     *
     * @param  int|string    $number  Число после которого будет слово. Можно указать число в HTML тегах.
     * @param  string|array  $titles  Варианты склонения или первое слово для кратного 1.
     * @param  string        $param2  Второе слово, если не указано в параметре $titles.
     * @param  string        $param3  Третье слово, если не указано в параметре $titles.
     *
     * @return string 1 книга, 2 книги, 10 книг.
     *
     * @version 2.0
     */
    function num_decline( $number, $titles, $param2 = '', $param3 = '' ){
    
    	if( $param2 )
    		$titles = [ $titles, $param2, $param3 ];
    
    	if( is_string($titles) )
    		$titles = preg_split( '/, */', $titles );
    
    	if( empty($titles[2]) )
    		$titles[2] = $titles[1]; // когда указано 2 элемента
    
    	$cases = [ 2, 0, 1, 1, 1, 2 ];
    
    	$intnum = abs( intval( strip_tags( $number ) ) );
    
    	return "$number ". $titles[ ($intnum % 100 > 4 && $intnum % 100 < 20) ? 2 : $cases[min($intnum % 10, 5)] ];
    }

    Удобно, что параметры можно передавать по-разному. Чтобы каждый раз не вспоминать как именно нужно передавать, например:

    echo num_decline( 4, 'книга, книги, книг' ); // > 4 книги
    
    echo num_decline( 21, 'книга', 'книги', 'книг' ); // > 21 книга
    
    echo num_decline( 5, array('книга','книги','книг') ); // > 5 книг
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация