PHP – функция склонения слов после числительных
Сообщение отправлено 1 часов назад… На нашем сайте присутствует 815 посетитель… Тема просмотрена 33 раз…
Склонение слов-существительных после числительных, судя по всему, проблема для многих программистов. Но за этим незнанием или небрежностью порой можно усмотреть наплевательское отношение к посетителям и читателям ресурса, которые в большинстве своём успели пройти курс средней школы и замечают такие ошибки легко.
А ведь для того, чтобы склонения слов не резали слух и глаз, потребуется совсем небольшая функция…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function declension($digit,$expr,$onlyword=false) { if(!is_array($expr)) $expr = array_filter(explode(' ', $expr)); if(empty($expr[2])) $expr[2]=$expr[1]; $i=preg_replace('/[^0-9]+/s','',$digit)%100; if($onlyword) $digit=''; if($i>=5 && $i<=20) $res=$digit.' '.$expr[2]; else { $i%=10; if($i==1) $res=$digit.' '.$expr[0]; elseif($i>=2 && $i<=4) $res=$digit.' '.$expr[1]; else $res=$digit.' '.$expr[2]; } return trim($res); } |
Передаваемые параметры
- $digit – передаваемое целое числительное, например “33″; можно использовать вместе с html-тэгами оформления;
- $expr – массив формы слова, следующего после числительного, например “array(‘корова’, ‘коровы’, ‘коров’)”; 1,21,31… корова, 2,3,4,22,23,24… коровы, 5,6…9,10,11…20,25,26… коров;
- $onlyword – если стоит true, то функция будет возвращать только существительное, идущее после числительного.
Вызов функции
1 2 3 4 | $count = 3; echo "На сайте найдено ".declension($count, array('книга', 'книги', 'книг'))." этого автора"; "На сайте найдено 3 книги этого автора" |
Использование функции склонения слов в CakePHP. Способ 1
Если вы планируете часто пользоваться этой функцией в ваших вьюшках, то лучше всего вынести её в отдельный хелпер.
Для этого создаем в папке app/views/helpers файл с именем, например, rusgram.php следующего содержания:
1 2 3 4 5 6 7 8 | <?php class RusgramHelper extends AppHelper { function declension($digit,$expr,$onlyword=false) { ... текст функции... } } ?> |
Теперь, подключаем хэлпер в нужном вам контроллере (а лучше в app_controller.php):
1 2 3 | class AppController extends Controller { var $helpers = array('Html', 'Form', 'Rusgram'); ... |
И всё – склоняйте на здоровье и на радость грамотным посетителям!
1 | echo $rusgram->declension($votes, array('оценка', 'оценки', 'оценок')); |
Использование функции склонения слов в CakePHP. Способ 2
Как подсказал в комментариях michas, для склонения русских слов в CakePHP можно воспользоваться уже имеющейся функцией __n.
Как это выглядит: в файле русской локали (app/locale/rus/LC_MESSAGES/default.po) прописываем словоформы для английских единственного и множественного числа и для русских вариантов.
1 2 3 4 5 | msgid "page" msgid_plural "pages" msgstr[0] "страница" msgstr[1] "страницы" msgstr[2] "страниц" |
А во вьюшке пишем вывод склоняемого слова, используя английские варианты:
1 | __n('page', 'pages', $number); |
Соответственно от значения переменной $number будет меняться форма выводимого слова.
Чтобы это работало, необходимо включить русскую локаль. И прописывать в PO файле необходимые вам варианты слов.
1 | Configure::write('Config.language', 'ru'); |
Похожие статьи:
Комментарии
Добавить комментарий

admin


Для CakePHP есть встроенная функция –
http://api.cakephp.org/file/cake/basics.php#function-__n
Спасибо! Не знал и не использовал раньше эту функцию. Добавил о ней пункт в пост.