@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);
    }
  • Вопрос задан
  • 1416 просмотров
Пригласить эксперта
Ответы на вопрос 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
@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;
}


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

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

Похожие вопросы