Окт
4

PHP – функция склонения слов после числительных

Author admin    Category CakePHP, PHP     Tags

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');

Первооснова


Похожие статьи:

Комментарии

Добавить комментарий

Перед отправкой формы:
Human test by Not Captcha