Справочники, инструменты, документация

PHP: Склонение, как вывести слова с разной формой окончания

Часто возникает необходимость вывода числа с текстовой подписью. Например, вывод количества дней: 1 день, 2 дня, 5 дней. Форма слова меняется в зависимости от числа. Чтобы не писать условия для каждого случая, создадим универсальное условие.
// Функция склонение после числительных
function num_form( $number, $forma1, $forma2, $forma3 ){
    if( $number == "0" ) $forma = $forma3;
    elseif( ($number >= 5) && ($number <= 20) ) $forma = $forma3;
    elseif( preg_match('/[056789]$/', $number) ) $forma = $forma3;
    elseif( preg_match('/[1]$/', $number) ) $forma = $forma1;
    elseif( preg_match('/[234]$/', $number) ) $forma = $forma2;

    return "$number $forma";
}

$array = array(1, 2, 5);
    foreach($array as $num){
    echo num_form($num, "день", "дня", "дней") . "<br>";
}

/*
1 день
2 дня
5 дней
*/

Вопрос стар как мир - склонение слов в зависимости от общего количественного показателя. Например, на сайте 15 гостей и 3 новые новости. В английском языке достаточно формы day(s), byte(s) и т.д., но для других языков этого мало. Конструкциях число + слово обязательно придется учитывать склонения. Формы вроде гостя(ей) и новость(ей) совершенно не красят сайты, тем более давно можно решить данный вопрос с помощью средств программирования.

function num2word($num,$words) {
 $num=$num%100;
 if ($num>19) { $num=$num%10; }
 switch ($num) {
  case 1: { return($words[0]); }
  case 2: case 3: case 4: { return($words[1]); }
  default: { return($words[2]); }
 }
}

Параметры вызова: $num - число, $words - массив склонений нужного слова. Как формируется массив вы можете посмотреть на примерах.

// Гостей
$num1=2;
$words1=Array("гость", "гостя", "гостей");
// Новостей
$num2=3;
$words2=Array("новость", "новости", "новостей");
// Написать по-русски
echo "Сейчас на сайте ";
echo $num1." ".num2word($num1,$words1); // сколько гостей
echo " и ";
echo $num2." ".num2word($num2,$words2); // сколько новостей

Результат работы скрипта: Сейчас на сайте 2 гостя и 3 новости

Чтобы было удобнее формировать массивы со склонениями, запомните ряд чисел 1-2-5, а потом мысленно подставляйте их в массив: (один рубль, два рубля, пять рублей) или (одна новость, две новости, пять новостей).