Компьютеры
и программирование

Счётчик обратного отчёта

Если на сайте анонсируется какая-либо акция, то сайт значительно выигрывает, если на нём есть блок, показывающий, сколько времени осталось до её начала - счётчик обратного отсчёта. Также счётчик обратного отсчёта может показывать, сколько времени осталось до окончания акции, если акция уже действует.

Разберём пример, когда на сайте организуются конкурсы с участием посетителей сайта. У каждого конкурса в админке устанавливается дата окончания. Счётчик обратного отсчёта должен показывать, сколько дней, часов и минут осталось до окончания.

1. Сначала позаботимся о правильном склонения слов перед числами. Например, если оставшееся время - 45 дней и т.д., то счётчик на сайте и должен выдавать именно "дней", а не "дня" или "день". А если остался 21 день и т.д., то нужно писать именно "день". То же самое с часами и минутами. За это отвечает пользовательская функция correctForm. Её код приведён ниже.

Код PHP

//функция склонения слов перед числами

function correctForm($number, $suffix) {

$keys = array(2, 0, 1, 1, 1, 2);

$mod = $number % 100;

$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];

return $suffix[$suffix_key];

}

2. Далее нам нужно получить дату окончания конкурса, отображаемого на текущей странице. Для этого пишем запрос к базе данных, где end_ - дата в формате числа и времени. Присваиваем её значение переменной $real_end. Затем получаем текущую дату и время функцией PHP date.

Код PHP

$resultT=mysql_query("select end_ FROM competitions WHERE cid='$cid'") or die (mysql_error());

$myrowT=mysql_fetch_array($resultT);

$real_end=$myrowT[end_];

$dat=date("Y-m-d, H:i:s");

3. И, собственно, сам счётчик обратного отсчёта. Два раза используем функцию PHP strtotime, которая преобразует текстовое представление даты на английском языке в метку времени Unix для текущей даты и даты окончания конкурса. Получаем разницу в секундах между датой окончания и текущей датой. Далее, используя функцию PHP floor, возвращающую ближайшее меньшее целое, вычисляем оставшиеся дни, часы и минуты. Вычисления основаны на том, что в минуте 60 секунд, в 1 часе 3600 секунд, в 1 дне 86400 секунд.

Код PHP

//вычисление оставшихся дней, часов и минут

$now_date = strtotime($dat);

$future_date = strtotime($real_end);

$difference_days = $future_date - $now_date;

$days = floor($difference_days/86400);

$difference_hours = $difference_days % 86400;

$hours = floor($difference_hours/3600);

$difference_min = $difference_hours % 3600;

$min = floor($difference_min/60);

4. Теперь применяем пользовательскую функцию correctForm склонения слов перед числами.

Код PHP

$array1 = array("день", "дня", "дней");

$word1 = correctForm($days, $array1);

$array2 = array("час", "часа", "часов");

$word2 = correctForm($hours, $array2);

$array3 = array("минута", "минуты", "минут");

$word3 = correctForm($min, $array3);

printf('<div class="time"><h1>%s %s %s %s %s %s</h1>до закрытия конкурса</div>', $days,$word1,$hours,$word2,$min,$word3);

5. И, наконец, полный код блока, реализующего счётчик обратного отсчёта. Как в случае с конкурсами, он точно так же может производит обратный отсчёт для акций на те или иные товары на сайте-каталоге или любой другой отсчёт времени, оставшегося до какого-либо "часа Ч".

Код PHP

//функция склонения слов перед числами

function correctForm($number, $suffix) {

$keys = array(2, 0, 1, 1, 1, 2);

$mod = $number % 100;

$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];

return $suffix[$suffix_key];

}

$resultT=mysql_query("select end_ FROM competitions WHERE cid='$cid'") or die (mysql_error());

$myrowT=mysql_fetch_array($resultT);

$real_end=$myrowT[end_];

$dat=date("Y-m-d, H:i:s");

//вычисление оставшихся дней, часов и минут

$now_date = strtotime($dat);

$future_date = strtotime($real_end);

$difference_days = $future_date - $now_date;

$days = floor($difference_days/86400);

$difference_hours = $difference_days % 86400;

$hours = floor($difference_hours/3600);

$difference_min = $difference_hours % 3600;

$min = floor($difference_min/60);

$array1 = array("день", "дня", "дней");

$word1 = correctForm($days, $array1);

$array2 = array("час", "часа", "часов");

$word2 = correctForm($hours, $array2);

$array3 = array("минута", "минуты", "минут");

$word3 = correctForm($min, $array3);

printf('<div class="time"><h1>%s %s %s %s %s %s</h1>до закрытия конкурса</div>', $days,$word1,$hours,$word2,$min,$word3);

Поделиться с друзьями