@zeaovede

Как реализовать склонения слов после чисел в исходном коде php?

Здравствуйте. Как реализовать склонения слов после чисел в исходном коде php?

<?php
function time_elapsed_string($datetime, $full = false) {
    $now = new DateTime;
    $ago = new DateTime($datetime);
    $diff = $now->diff($ago);

    $diff->w = floor($diff->d / 7);
    $diff->d -= $diff->w * 7;

    $string = array(
        'y' => 'год',
        'm' => 'месяц',
        'w' => 'неделя',
        'd' => 'день',
        'h' => 'час',
        'i' => 'минута',
        's' => 'секунда',
    );
    foreach ($string as $k => &$v) {
        if ($diff->$k) {
            $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 'а' : '');
        } else {
            unset($string[$k]);
        }
    }

    if (!$full) $string = array_slice($string, 0, 1);
    return $string ? implode(', ', $string) . ' назад' : 'только что';
}
?>

<?php echo time_elapsed_string('2024-05-05 00:22:35'); ?>

ссылка на песочницу

Хотелось бы сделать, чтобы отображалось дня, дней, недели, недель, месяцев, лет.
  • Вопрос задан
  • 100 просмотров
Решения вопроса 2
vhood
@vhood
Не забывайте отмечать решения
Не ломать голову и использовать готовый инструмент

Пример из README (только на русском):
echo Carbon::now()->subMinutes(2)->locale('ru_RU')->diffForHumans(); // '2 минуты назад'

Документация настройки вариантов переводов здесь (можно с запятыми, можно словами без цифр и т.д.)
Ответ написан
Комментировать
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Нужно добавить варианты склонения
Для русского языка это обычно по три варианта которые формируются по правилу "один ___", "два ___", "много (пять) ___"
один день
два дня
много дней

<?php
function time_elapsed_string($datetime, $full = false) {
    $now = new DateTime;
    $ago = new DateTime($datetime);
    $diff = $now->diff($ago);

    $diff->w = floor($diff->d / 7);
    $diff->d -= $diff->w * 7;

    //один ___, два ___, много ___
    $string = array(
        'y' => ['год', 'года', 'лет'],
        'm' => ['месяц', 'месяца', 'месяцев'],
        'w' => ['неделя', 'недели', 'недель'],
        'd' => ['день', 'дня', 'дней'],
        'h' => ['час', 'часа', 'часов'],
        'i' => ['минута', 'минуты', 'минут'],
        's' => ['секунда', 'секунды', 'секунд'],
    );
    foreach ($string as $k => &$v) {
        if ($diff->$k) {
            $v = $diff->$k . ' ' . pluralize($diff->$k, $v);
        } else {
            unset($string[$k]);
        }
    }

    if (!$full) $string = array_slice($string, 0, 1);
    return $string ? implode(', ', $string) . ' назад' : 'только что';
}

function pluralize($n, array $forms) 
{
    return 
    $n%10==1 && $n%100!=11
     ? $forms[0] :
     ( $n%10>=2 && $n%10<=4 && ($n%100<10 || $n%100>=20)
        ?$forms[1] : $forms[2]
    );
}

?>
<?php echo time_elapsed_string('2019-04-22 00:22:35'); ?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
toxa82
@toxa82
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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