@yapaofficial

Как можно улучшить код отображения даты выпуска новости?

<?php 
function time_ago($datetime) {
    $interval = date_create('now')->diff($datetime);

    if ($interval->y >= 5) {return $interval->y.' лет назад';}
    if ($interval->y >= 2) {return $interval->y.' года назад';}
    if ($interval->y >= 1) {return $interval->y.' год назад';}

    if ($interval->m >= 5) {return $interval->m.' месяцев назад';}
    if ($interval->m >= 2) {return $interval->m.' месяца назад';}
    if ($interval->m >= 1) {return $interval->m.' месяц назад';}

    if ($interval->d >= 5) {return $interval->d.' дней назад';}
    if ($interval->d >= 2) {return $interval->d.' дня назад';}
    if ($interval->d >= 1) {return $interval->d.' день назад';}

    if ($interval->h >= 5) {return $interval->h.' часов назад';}
    if ($interval->h >= 2) {return $interval->h.' часа назад';}
    if ($interval->h >= 1) {return $interval->h.' час назад';}

    if ($interval->i >= 5) {return $interval->i.' минут назад';}
    if ($interval->i >= 2) {return $interval->i.' минуы назад';}
    if ($interval->i >= 1) {return $interval->i.' минуту назад';}
 
    return $interval->s.' секунд';
}

$as1 = time_ago(new DateTime('2023-01-07 18:29:50')); // 29 лет

echo "$as1";

 ?>
  • Вопрос задан
  • 150 просмотров
Решения вопроса 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
ИМХО не надо насиловать мозг когда задача решена "не изящно, но практично". Приведенное решение вполне аккуратное и рабочее, из мелких косяков - не учтено что окончания меняются через десяток, что легко поправляется делением с остатком на 10 (%). Будет желание повозиться с более красивым решением - на досуге поколупаете, полезное упражнение...
Ответ написан
i__dmitry
@i__dmitry
Weaving a web
Если уж речь идёт только о том, чтобы выдавать слово в нужном склонении в зависимости от входного числа, можно воспользоваться примерно такой функцией:

function getCase ($number, $params) : string {
    $cases = [2, 0, 1, 1, 1, 2];
    return $number . ' ' . $params[($number % 100 > 4 && $number % 100 < 20) ? 2 : $cases[min($number % 10, 5)]];
}

echo getCase(1, ["год", "года", "лет"]); // "1 год"
echo getCase(4, ["месяц", "месяца", "месяцев"]); // "4 месяца"
echo getCase(25, ["день", "дня", "дней"]); // "25 дней"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы