Рейтинг 4.6 из 5 (5 Голосов)

sklonenia

Сейчас на сайте 2 гостей и 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, а потом мысленно подставляйте их в массив: (один "рубль", два "рубля", пять "рублей") или (одна "новость", две "новости", пять "новостей").

После небольшой оптимизации функцию можно записать в одну строчку:

 function num2word($n,$words) {
        return ($words[($n=($n=$n%100)>19?($n%10):$n)==1?0 : (($n>1&&$n<=4)?1:2)]);
    }
Просмотров: 5224 Печать Назад