Склонение слов на PHP
Весьма популярной проблемой, с которой сталкиваются Web-программисты, это склонение слов на PHP. Например, нужно вывести, сколько минут назад была оставлено какое-нибудь сообщение. Можно написать просто число и слово "минут". Но тогда будет написано весьма странно, например, "1 минут", "2 минут" и так далее. Фактически, без склонения слов на PHP Вам не обойтись, если, конечно, Вы хотите писать по-русски.
Проблема новичкам покажется очень сложной, но, на самом деле, у склонения слов есть определённая закономерность. Посмотрите сами: "1 минута, 2 минуты, 5 минут, 11 минут, 19 минут, 21 минута, 22 минуты, 25 минут и так далее". Видите закономерность? 1, 21, 31, 41 - всегда будет "минута". Если младший разряд больше 1-го и меньше 5, при этом само число при делении на 100 имеет остаток больше 20 (то есть, например, не число 12 и не 112), то будут "минуты". В остальных случаях "минут".
А вот дальше уже начинается построение алгоритма, поскольку закономерность очевидно имеется. Я приведу Вам, на мой взгляд, самый красивый алгоритм. Он наиболее короткий, и в то же время очень быстрый.
<?php
function getWord($number, $suffix) {
$keys = array(2, 0, 1, 1, 1, 2);
$mod = $number % 100;
$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
return $suffix[$suffix_key];
}
$array = array("минута", "минуты", "минут");
$n = 21;
$word = getWord($n, $array);
echo "$n $word<br />";
$n = 11;
$word = getWord($n, $array);
echo "$n $word<br />";
$n = 4;
$word = getWord($n, $array);
echo "$n $word<br />";
?>
Запустив данный скрипт Вы увидите, что склонение слов на PHP происходит на ура. Могу лишь добавить, что помимо "минут" там может быть "день", "час", "человек", "компьютер" и все другие существительные, которые склоняются в зависимости от числительного.
-
- Михаил Русаков
Комментарии (9):
Спасибо Михаил за скрипт как раз в тему, давно хотел создать такой скрипт да руки не доходили. Побольше бы таких продуктивных уроков. А так ты молодец!
Ответить
Как оказывается просто! Я пошел длинной дорогой. if(($age===1)||($age===2)||...){$mes_age = 'года';}
Ответить
Михаилу это легко делать потому что он умный, и знает математику, я не знаю математику и мне написать такое никогда не удастся
Ответить
Михаил, у Вас ошибка в слове "компьтер"
Ответить
Спасибо, исправил.
Ответить
Это перевод на русский язык, а если сайт мультиязычный? Для этого все уже давно придумано и есть такие утилиты как gettext
Ответить
Ваше дело, используйте их.
Ответить
Прокомментируйте, пожалуйста, функцию.
Ответить
А можно не изобретать велосипеды, а воспользоваться библиотекой Morphos: - Пример (можете изменить минута на час или год или секунда): http://morphos.tech/try/numerals?number=15&word=%D0%BC%D0%B8%D0%BD%D1%83%D1%82%D0%B0 - А в коде использовать еще проще: echo pluralize('минут', 15); и оно выведёт правильную форму слова в зависимости от количества.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.