ФорумПрограммированиеПыхнуть хотите?Готовые решения → Время для комментов...

Время для комментов...

  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 26 августа 2010 г. 5:37, спустя 23 секунды

    Как-то видел такую плюшку на каком-то форуме - Posted 20 minuts ago… Нашел ее представление, но она была на английском…

    Как же просто у них с окончаниями:
    $time = $minuts == 1 ? "Posted minute ago" : "Posted $minuts minuts ago";

    Сволочи((

    В общем решил сделать своё, по-русски)) Опять же, от нефиг делать)) Вдрух кому пригодится))

    	function timeAgo($time)
    {
    $diff = time() - $time; // разница с настоящим временем

    $seconds = $diff; // секунды
    $minutes = round($diff/60); // секунд в минуте
    $hours = round($diff/3600); // в часе
    $days = round($diff/86400); // в дне
    $weeks = round($diff/604800); // в неделе
    $months = round($diff/2419200); // в месяце
    $years = round($diff/29030400); // в году

    $pattern = "/1([0-9])\b|(?<!1)(1)\b|(?<!1)([234])\b|(?<!1)([567890])\b/"; // разбиваю двухзначное число по окончаниям (1, 2-4, 5-19, %1, %2-4, %5-0)
    if($seconds <= 60) {
    preg_match($pattern, $seconds, $m);
    if ($m[1] != '') { // раскидываю окончания
    $suff = "";
    } elseif ($m[2] != '') {
    $suff = "у";
    } elseif ($m[3] != '') {
    $suff = "ы";
    } elseif ($m[4] != '') {
    $suff = "";
    }
    $time_ago = "$seconds секунд$suff назад"; // вывожу с окончанием… дальше все повторяется
    } elseif ($minutes <= 60) {
    preg_match($pattern, $minutes, $m);
    if ($m[1] != '') {
    $suff = "";
    } elseif ($m[2] != '') {
    $suff = "у";
    } elseif ($m[3] != '') {
    $suff = "ы";
    } elseif ($m[4] != '') {
    $suff = "";
    }
    $time_ago = "$minutes минут$suff назад";
    } else if($hours <= 24) {
    preg_match($pattern, $hours, $m);
    if ($m[1] != '') {
    $suff = "ов";
    } elseif ($m[2] != '') {
    $suff = "";
    } elseif ($m[3] != '') {
    $suff = "а";
    } elseif ($m[4] != '') {
    $suff = "ов";
    }
    $time_ago = "$hours час$suff назад";
    } else if($days <= 7) {
    if ($days == 1) {
    $suff = "ень";
    } elseif ($days == 2 || $days == 3 || $days == 4) {
    $suff = "ня";
    } else {
    $suff = "ней";
    }
    $time_ago = "$days д$suff назад";
    } else if($weeks <= 4) {
    $suff = $weeks == 1 ? "ю" : "и";
    $time_ago = "$weeks недел$suff назад";
    } else if($months <= 12) {
    if ($months == 1) {
    $suff = "";
    } elseif ($months == 2 || $months == 3 || $months == 4) {
    $suff = "а";
    } else {
    $suff = "ев";
    }
    $time_ago = "$months месяц$suff назад";
    } else {
    preg_match($pattern, $years, $m);
    if ($m[1] != '') {
    $suff = "лет";
    } elseif ($m[2] != '') {
    $suff = "год";
    } elseif ($m[3] != '') {
    $suff = "года";
    } elseif ($m[4] != '') {
    $suff = "лет";
    }
    $time_ago = "$years $suff назад";
    }
    return $time_ago;
    }


    Как обычно все через жопу, но работает)) Выводит 1-60 секунд, 1-60 минут, 1-24 часов, 1-7 дней, 1-4 недель, 1-12 месяцев, 1-99 лет (на трёхзначных числах не тестил) с соответствующими окончаниями. Например:
    1 секунду назад
    2 секунды назад
    5 часов назад

    зы, не все протестил, но косяков не должно быть))
    Высокоуровневое абстрактное говно
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 25 августа 2010 г. 15:17, спустя 9 часов 40 минут 10 секунд

    ой как ужасно все выглядит.
    сам что то подобное уже делал. Там гораздо элегантней было.

  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 25 августа 2010 г. 15:19, спустя 1 минуту 52 секунды

    показывай))
    Высокоуровневое абстрактное говно
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 25 августа 2010 г. 16:13, спустя 54 минуты 14 секунд

  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 25 августа 2010 г. 16:24, спустя 11 минут 1 секунду

    Stasovsky, ты пиздец)))
    Спустя 180 сек.
        /**
    * Получение склонения слова после числа
    * @param int $digit число
    * @return int
    * @todo по моему при 30,40 и тп будет 0 возвращать. Надо проверить.
    */
    public function getDesl ($digit) {
    $digit = ($digit > 20) ? $digit % 10 : $digit;
    if ($digit >= 5) return (int) 3;
    if ($digit >= 2) return (int) 2;
    if ($digit == 1) return (int) 1;
    return (int) 0;
    }

    И потом в шаблонизаторе сделать что то типа.
    {{ count }} комментари(й,я,ев)
    Спустя 39 сек.
    Или я зря не стал читать тонну кода?)
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 26 августа 2010 г. 0:23, спустя 7 часов 58 минут 47 секунд

    Stasovsky, вылысыпыдыст хуев :))))
    С возвращением, Пiха!
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 26 августа 2010 г. 4:30, спустя 4 часа 7 минут 1 секунду

    Ответы доставляют ещё больше сабжа.
  • }/{EHR

    Сообщения: 734 Репутация: N Группа: Адекваты

    Spritz 26 августа 2010 г. 5:00, спустя 30 минут

    Попробовал ее запустить. Она мне ничего не выдает.
  • }/{EHR

    Сообщения: 734 Репутация: N Группа: Адекваты

    Spritz 26 августа 2010 г. 5:05, спустя 5 минут 28 секунд

    return $comment_time;

    А больше в коде ни где такой переменной нет… Замени на time_ago
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 26 августа 2010 г. 5:36, спустя 31 минуту 4 секунды

    там надо
    return $time_ago;

    опечатка))
    Высокоуровневое абстрактное говно
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 26 августа 2010 г. 5:41, спустя 5 минут 7 секунд

    значит в пыхе еще не так силен))
    Высокоуровневое абстрактное говно
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 26 августа 2010 г. 6:14, спустя 32 минуты 55 секунд

    vasa_c, что конкретно тебе доставляет (из моего варианта)? Чтобы знать над чем работать!
    Спустя 200 сек.
    Stasovsky, главная твоя ошибка в том, что ты сделал слишком узкую по своему применению функцию.
    Ну и регулярки для столь простой задачи юзать как то не очень.
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 26 августа 2010 г. 6:15, спустя 1 минуту 4 секунды


    значит в пыхе еще не так силен))

    Это показывает не знание и владение PHP, а умение придумывать алгоритмы.

    так что перефразируем
    "значит в составлении алгоритмов еще не так силен))"
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 26 августа 2010 г. 6:52, спустя 36 минут 35 секунд

    SpartakuS, спс за getDesl, понтовая штука))
    Спустя 116 сек.
    у тебя случаем нет такого же понтового пятистрочного пагинатора?))
    Высокоуровневое абстрактное говно
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz 26 августа 2010 г. 7:21, спустя 29 минут 31 секунду

    Не, пагинатор мне не нравится мой)

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