23.3. Практическое применение функций даты и времени в PHP
Познакомившись с функциями, вам, наверно, не терпится увидеть, как все это можно применить на практике и как вообще строятся подобные скрипты. Для начала можно взять наиболее простой и популярный скрипт показа времени на вашей Web-страничке. Реализовать это да РНР достаточно легко. Например:
<?
$ch = Date("H") ; // читаем показания часов
$mi = Date ("i") ; // читаем показания минут
$h1 = "час"; // определяем переменные для часов
$h2 = "часа";
$h3 = "часов";
$m1 = "минут"; // определяем переменные для минут
$m2 = "минута";
$m3 = "минуты";
// проверяем, какое из слов подходит к показаниям часов
if ($ch == 1 or $ch == 21) {
$h = $h1;
}
else {
if ($ch > 1 and $ch <= 4 or $ch > 20 and $ch <= 24)
{
$h = $h2;
}
else {
$h = $h3;
}
}
// проверяем, какое из слов подходит к показаниям минут
if ($mi == 0 or $mi > 4 and $mi <= 20 or $mi > 24 and $mi <= 30 or $mi > 34 and $mi <= 40 or $mi > 44 and $mi <= 50 or $mi > 54 and $mi <= 60) {
$m = $m1;
}
else {
if ($mi == 1 or $mi == 21 or $mi == 31 or $mi == 41 or $mi == 51) {
$m = $m2;
}
else {
$m = $m3;
}
}
// выводим результат на экран
echo "Сейчас $ch $h, $mi $m";
?>
Результат выполнения программы приведен на рис. 23.1.
С большинством того, что демонстрирует этот скрипт, вы уже знакомы по предыдущим примерам, но кое-что новое здесь есть. В первых же строчках скрипта определяется время. Сначала считываются показания часов, затем минут. Эти числа, соответственно, попадают в указанные нами переменные и уже могут быть выведены на экран. Но все не так просто. Если сделать логический вывод в соответствии с законами русского языка, то если 1, то час, а если 2, то часа, и т. д. В следующих
Рис. 23.1. Результат выполнения скрипта
строках скрипта определяются слова для дальнейшего использования. Подходят три варианта — час, часов, часа. Считанное показание текущего времени сохранено в переменной $ch, и работать будем именно с ней. В первой строке проверки смотрим, равно ли $ch единице или 21. Не трудно догадаться, что это те числа, при которых следует поставить слово час. Если да, то переменной $h присваивается значение $h1. To же самое с помощью логического оператора or мы проделываем с оставшимися двумя переменными.
С минутами дело обстоит немного сложнее, ввиду того что минут по количеству больше, чем часов, но алгоритм уже известен и вывести на экран нужное слово труда не составляет.
Пример 23.6. Определение времени суток
<?php
$h=date ( 'Н' );
if ($h>=6 && $h<=11) echo "Доброе утро!";
if ($h>=12 && $h<=17) echo "Добрый день!";
if ($h>=18 && $h<=23) echo "Добрый вечер!";
if echo "Доброй ночи!";
?>
Этот простой скрипт может выводить на вашей странице приветствие, зависяще е от времени суток. Конечно, цифры желаемого времени вы можете проставлять любые, все зависит от вашего личного понятия дня и ночи.
Пример 23.7. Вывод даты
<?php
// определяем массив для месяцев
$q[]="";
$q[]="января";
$q[]="февраля";
$q[]="марта";
$q[]="апреля";
$q[]="мая";
$q[]="июня";
$q[]="июля";
$q[]="aвгуста";
$q[]="сентября";
$q[]="октября";
$q[]="ноября";
$q[]="декабря";
// определяем массив для дней недели
$е[0]="воскресенье";
$е[1]="понедельник";
$е[2]="вторник";
$е[3]="среда";
$е[4]="четверг";
$е[5]="пятницa";
$e[6]="cyбботa";
// считываем месяц
$m=date{'m');
if ($m=="01") $m=1;
if ($m=="02") $m=2;
if ($m=="03") $m=3;
if ($m=="04") $m=4;
if ($m=="05") $m=5;
if ($m=="06") $m=6;
if ($m=="07") $m=7;
if ($m=="08") $m=8;
if ($m=="09") $m=9;
// считываем день недели
$we=date('w');
// считываем число
$chislo=date('d');
// извлекаем день из недели
$den_nedeli = $e[$we];
// извлекаем значение месяца
$mesyac = $q[$m];
echo "Сегодня ".$chislo." ".$mesyac.", ".$den_nedeli;
?>
Рассмотрим, как работает этот скрипт. Сначала нам нужно определить два массива, в которых будут храниться соответственно русское название месяца и русское название дня недели. Месяц не может быть нулевым, поэтому нам нужно позаботиться о вводе элемента массива с нулевым индексом. Если индекс массива не указан, он принимается равным внутреннему указателю. Если массив пуст и еще не определен, внутренний указатель находится на первом элементе (имеющем индекс нуль). Ввод нового элемента массива перемещает внутренний указатель на единицу вверх, и таким образом обеспечивается последующий ввод значения массива в ячейку массива, имеющую индекс на единицу больший, чем предыдущая. В принципе, можно обеспечить ввод данных в массив разными способами. Но указанный здесь — самый легкий. Мы просто присваиваем поочередно нужные нам данные элементам массива, и таким образом заполняем его. Точно также и со вторым массивам. Только тут уже индекс нужных ячеек массива указывается явно, и внутренний указатель устанавливается на тот индекс, который задан, а после ввода значения перемещается вверх на единицу. Разница между этими двумя методами в том, что если массив уже был определен ранее и индекс при вводе не указан, заполнится ячейка массива, на которой находится внутренний указатель. А он ведь может стоять и в конце! А если индекс указан явно, внутренний указатель перемещается на его значение и запись происходите явно указанную ячейку. Часто массивы бываютгораздо длиннее приведенных в примере, и удобнее воспользоваться специальной функцией, которая позволяет считать указанный в ней файл и ввести все, что есть в этом файле, в массив. Причем разделителем считается перевод строки, что очень удобно. Синтаксис этой функции — $имя массива = file ("имя файла");.
Дальше формируется массив с указанным именем и значениями, соответствующими строкам файла.
Когда массивы определены, нужно считать номер месяца. Он записывается с ведущим нулем, если номер месяца менее десяти, и поэтому нам нужно позаботиться об его отсечении. Тут можно применить разные алгоритмы и методы, но мы просто сравним полученное решение с рядом заранее известных вариантов и изменим номер месяца на правильный без нуля. Хотя так делать неправильно — есть более корректные методы, например проверить полученное значение на ведущий нуль, и если проверка истинна (самый первый символ в строке — нуль), удалить первый символ.
Далее по ходу скрипта считываются день недели и число. С числом делать ничего не нужно, так как дата будет понятна всем, а вот день недели и месяц должны подвергнуться обработке. Извлекаем из введенного нами ранее массива день недели. Номер дня недели указывает на ячейку нашего массива, где хранится нужное русское имя, и таким образом мы в любом случае получим правильное значение. Меняется номер дня недели и номер (индекс) ячейки, из которой считывается значение. Причем тут в отличие от массива с именем месяца нулю соответствует воскресенье, что мы и учли при вводе массива дней недели. Точно такую же операцию проводим и для месяца. Его номер указывает на ячейку массива, где хранится правильное имя месяца на русском языке. А дальше — выводим результат на экран в произвольной форме.