@i_yurievi4

Как сделать склонения слов секунда, секунд, секунды?

Вот сама функция
public function convertTime($iTime, $sDefault = null, $bIsShortType = false)
    {
        $iSeconds = (int)round(abs(PHPFOX_TIME - $iTime));
        $iMinutes = (int)round($iSeconds / MINUTE_IN_SECONDS);

        if ($iMinutes < 1) {
            if ($iSeconds === 0 || $iSeconds === 1) {
                return _p('1_second_ago'); <b>эта фраза выводиться если пост был создан 1 секунду назад</b>
            }
            return _p('total_seconds_ago', ['total' => $iSeconds]); <b>эта фраза выводит количество секунд к примеру 2 и на сайте получается выводится 2 секунд назад а надо сделать чтобы выводилось 2 секунды назад</b>
        }

        if ($iMinutes < MINUTE_IN_SECONDS) {
            if ($iMinutes === 0 || $iMinutes === 1) {
                return _p('1_minute_ago');
            }
            return _p('total_minutes_ago', ['total' => $iMinutes]);
        }

        $iHours = (int)round(floatval($iMinutes) / MINUTE_IN_SECONDS);

        if ($iHours < 24) {
            if ($iHours === 0 || $iHours === 1) {
                return _p('1_hour_ago');
            }

            return _p('total_hours_ago', ['total' => $iHours]);
        }

        if ($iHours < 48
            && ((int)date('d', PHPFOX_TIME) - 1) == date('d', $iTime)
        ) {
            return _p('yesterday') . ', '
                . Phpfox::getTime(Phpfox::getParam('core.conver_time_to_string'),
                    $iTime);
        }

        return Phpfox::getTime(Phpfox::getParam(($sDefault === null
            ? 'core.global_update_time' : $sDefault)), $iTime, true, $bIsShortType);
    }

Пробовал сделать так
public function convertTime($iTime, $sDefault = null, $bIsShortType = false)
    {
        $iSeconds = (int)round(abs(PHPFOX_TIME - $iTime));
        $iMinutes = (int)round($iSeconds / MINUTE_IN_SECONDS);

        if ($iMinutes < 1) {
            if ($iSeconds === 0 || $iSeconds === 1) {
                return _p('1_second_ago'); <b>эта фраза выводиться если пост был создан 1 секунду назад</b>
            }
else{
 if ($iSeconds >= 1 || $iSeconds <= 5) { если больше 1 но меньше 5 то выводим фразу
 return _p('isecondsi'', ['total' => $iSeconds]); и тогда в посте выводится если он опубликован больше секунды назад, что он опубликован 2  секунды назад 
}
            return _p('total_seconds_ago', ['total' => $iSeconds]); <b>эта фраза выводит количество секунд к примеру 2 и на сайте получается выводится 2 секунд назад а надо сделать чтобы выводилось 2 секунды назад</b>
        }

        if ($iMinutes < MINUTE_IN_SECONDS) {
            if ($iMinutes === 0 || $iMinutes === 1) {
                return _p('1_minute_ago');
            }
            return _p('total_minutes_ago', ['total' => $iMinutes]);
        }

        $iHours = (int)round(floatval($iMinutes) / MINUTE_IN_SECONDS);

        if ($iHours < 24) {
            if ($iHours === 0 || $iHours === 1) {
                return _p('1_hour_ago');
            }

            return _p('total_hours_ago', ['total' => $iHours]);
        }

        if ($iHours < 48
            && ((int)date('d', PHPFOX_TIME) - 1) == date('d', $iTime)
        ) {
            return _p('yesterday') . ', '
                . Phpfox::getTime(Phpfox::getParam('core.conver_time_to_string'),
                    $iTime);
        }

        return Phpfox::getTime(Phpfox::getParam(($sDefault === null
            ? 'core.global_update_time' : $sDefault)), $iTime, true, $bIsShortType);
    }
  • Вопрос задан
  • 1315 просмотров
Пригласить эксперта
Ответы на вопрос 5
delphinpro
@delphinpro Куратор тега PHP
frontend developer
В современные браузеры встроена поддержка плюрализации (IE и Safari за бортом)

https://developer.mozilla.org/en-US/docs/Web/JavaS...

Выдает на выходе строку, означающую форму, на основе которых мы можем сделать ассоциативный массив

let assoc = {
  one: 'Яблоко',
  few: 'Яблока',
  many: 'Яблок',
}
let number = 31;
let form = new Intl.PluralRules('ru-RU').select(number);
console.log(number, assoc[form]); // 31 Яблоко
Ответ написан
Комментировать
mahmudchon
@mahmudchon
НОЛЬ          - секунд
ОДНА          - секундА
ДВЕ           - секундЫ
ТРИ           - секундЫ
ЧЕТЫРЕ        - секундЫ
ПЯТЬ          - секунд
ШЕСТЬ         - секунд
СЕМЬ          - секунд
ВОСЕМЬ        - секунд
ДЕВЯТЬ        - секунд
ДЕСЯТЬ        - секунд
ОДИННАДЦАТЬ   - секунд
ДВЕНАДЦАТЬ    - секунд
ТРИНАДЦАТЬ    - секунд
ЧЕТЫРНАДЦАТЬ  - секунд
ПЯТНАДЦАТЬ    - секунд
ШЕСТНАДЦАТЬ   - секунд
СЕМНАДЦАТЬ    - секунд
ВОСЕМНАДЦАТЬ  - секунд
ДЕВЯТНАДЦАТЬ  - секунд
ДВАДЦАТЬ      - секунд
ДВАДЦАТЬ ОДНА - секундА

Тут логическая цепочка видна сразу.
Ответ написан
Комментировать
@402d
начинал с бейсика на УКНЦ в 1988
велосипед, который изобретает каждый программист
kesh.kz/blog/%D0%BF%D0%BE%D0%B4%D0%B1%D0%BE%D1%80-...
по ссылке ошибка с числом 2 .
В посте QNA-1976, без покрытия тестами сразу не поймешь правильно ли написано или нет.
Ответ написан
Делал в excel документе (точнее, в libreoffice calc) формулу для вывода числа в текст, и в конце "рубль", "рублей", "рубля"...
Если кратко - то просто прописать правило для чисел от нуля до 9 (0 секунд, 1 секунда, 2 секунды, 3 секунды, 4 секунды, 5 секунд, 6 секунд, 7 секунд, 8 секунд, 9 секунд), и в виде исключения диапазон от 10 до 20 секунд (ХХ секунд). А дальше из любого числа берём крайний разряд (от 0 до 9 числа) и по ним выводим по ранее прописанному правилу. Тут даже проще, чем число в текст, нужно только последнее слово изменять. Дальше 20 и до 60 это никак не поменяется.
Если лень делать и думать над алгоритмом - можно захардкодить массив от 0 до 59 и в нём вручную прописать то слово какое нужно, и его выводить. Но в принципе обычный свитч (CASE или что там в PHP) справится с диапазонами. Дальше сами.
Ответ написан
qant
@qant
programer
Гугли решения все уже есть, проблема не новая, и совмещай со своим кодом.

Пример найден почти сразу:

//Author PunBB
//Created 03/02/2017

//подготавливаем массив, к примеру на русском
$lang_pan_statistic = array (
   'views_one'         => 'просмотр',
   'views_several'         => 'просмотра',
   'views_many'         => 'просмотров',

   'users_one'         => 'посетитель',
   'users_several'         => 'посетителя',
   'users_many'         => 'посетителей',
);


function pan_fw_nouns_after_num($count, $form1='', $form2='', $form3='')
{
   global $forum_user;
   
   $binary = abs($count) % 100;
   $single = $count % 10;
   
   if ($forum_user['language'] == 'Russian')
   {
      if ($binary >= 11 && $binary <= 19) 
         return($form3);
      if ($single >= 2 && $single <= 4)
         return($form2);
      if ($single == 1)
         return($form1);
      
      ($hook = get_hook('pan_fw_fn_nouns_after_num_new_lang')) ? eval($hook) : null;
      
   } else {
      if ($count == 1)
         return($form1);
      else
         return($form2);
   }
   
   return $form3;
}


За тебя код писать никто не будет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
25 апр. 2024, в 14:44
10000 руб./за проект
25 апр. 2024, в 14:44
250 руб./в час