Red Spirit

Блог Алексея Таянчина

RSS 2.0

Склонение слова по числам на PHP

Если честно, не знаю как точно называется этот процесс, когда у слова меняется окончание в зависимости от того какое количество ему было присвоено, так что назвал это просто склонением )

Например, возьмем слово “диск“. Если он один, то так и пишем: “один диск“. Если их два, то надо писать уже “два диска” (окончание меняется). Если их пять, то пишем: “пять дисков“. Всего имеется 3 разных окончания: на 1, на 2, 3, 4 и на от 5 до 9 + 0. Этими подсчетами и занимается приведенная ниже функция. Мы указываем число и три варианта слова, а она возвращает это число с нужным словом.

Найти применение может где угодно, диапазон использования очень широк, например, указывать сколько юзеров на сайте (2 юзера или 8 юзеров) или писать сколько файлов загружено, чисто для улучшения визуального восприятия.

В итоге функция вернет значение “652 диска”. У функции есть еще пятый параметр установленный по-умолчанию в false, он показывает, заключать ли число в тэг B чтобы выделить его жирным, это так, для удобства.

  • webkitchen.pro

    Разработка и поддержка сайтов webkitchen.pro

  • мяу

    разучитесь так неочевидно обзывать переменные. Пожалуйста.

  • Быдлокодер

    Кровь из глаз потекла! =))) Если кому надо, вот более лаконичный и отрефакторенный

    public static function intMorphy ( $int, $im, $rd, $rdm )
    {
    $a = $int % 10;
    $b = $int % 100;

    switch(true) {
    case($a == 0 || $a >= 5 || ($b >= 10 && $b = 2 && $a <= 4):
    $result = $rd;
    break;
    }

    return $int . ' ' . $result;
    }

  • http://redspirit.ru Red Spirit

    Простите за ваши глаза, но о вкусах не спорят. Я со времен паскаля кейсы не люблю, к тому же применять его для трех условий, ну не знаю. Да и кейсы всегда медленнее чистых ифов. Посмотрел на свой код с точки зрения производительности, слегка его модифицировал поставив возвращение значения сразу после выполнения условий, причем наиболее частое условие ушло вверх, чтобы зря не выполнялись остальные.

  • deep

    От вашего кода кровь не только из глаз начинает идти.

  • Денис

    Кровь не кровь, с экономил 30 минут спасибо!

  • Илья

    function sklonen($number, $titles) {
    $cases = array (2, 0, 1, 1, 1, 2);
    return $titles[ ($number%100>4 && $number%100<20)? 2 : $cases[min($number%10, 5)] ];
    }
    print sklonen(652, ['диск', 'диска', 'дисков']);

  • TheRyuzaki

    По мне вполне хороший пример как можно сделать, хотя можно было бы и лучше обозвать переменнные

  • Роман Святун

    добра тебе