Пример предназначен для тех, кто начинает работать с php, и не только для них.
Результатом работы программы(скрипта) является прогноз погоды на 5 дней для любого, интересующего Вас города, выводимый в виде, который нравится именно Вам, а не дизайнерам сайта-донора.
Информация в таких случаях берется с известных серверов прогноза погоды (где не пишут фразу "запрещено использование информации" и т.п.). В данном случае используется сервер http://weather.yahoo.com/ , на котором есть страницы с погодой для довольно большого количества городов, и практически всегда можно найти если не интересующий Вас город, то ближайший ему и идентичный по погодным условиям.
Это законченный проект, работающий на сайте http://sim-sim.ru/ в разделе туризма "погода в мире".
Единственным недостатком является лишь то, что админу приходится вводить в текстовый файл (возможен вариант с mysql, но в том случае мне было проще сделать в файле) название населенного пункта на родном языке и ссылку на страницу с прогнозом погоды на него на сервере Яхо. Но никто за Вас этого делать не будет.
Посему, скрипт состоит из 2-х частей:
1. Файл с администрированием (вводится в первую строку название города, на следующей строке - ссылка). Разбирать работу данной части, думаю, не стоит, комментариев более чем достаточно.
2. Файл с самой программой. Работа программы будет подробно описана ниже.
1. Администрирование.
Выводим на экран форму с паролем pass. В окне вводятся: номера названия ссылки Затем, после нажатия на кнопку и проверки пароля, записываем новый список в файл.
<html>
<head>
<title>admin weather</title>
</head>
<body>
<?php
$adr=$DOCUMENT_ROOT."/weather/weather.ini"; // адрес файла, в котором и будут записываться названия городов со ссылками
$password='pass'; // простенькая система авторизации
$eror='Password eror!';
$old=file($adr); // читаем то, что сейчас есть в файле
if ($submit) { // проверяем на нажатость кнопки
if ($pass==$password) {
$fp=fopen($adr,"w");
fwrite ($fp, $ini); // записываем в файл измененные данные
fclose($fp);
$old=file($adr);
}
else {
echo $eror;
}
}
?>
<form method=post action="<?php echo $PHP_SELF?>"> // информация, введенная в форму, обрабатывается этим же файлом
$region=file($ini); // читаем файл со списком городов-ссылок а массив $region
// определение координат искомого города
for ($i=0; $i<sizeof($region); $i++) {
if (trim($region[$i])==$weather) { // ищем номер города в списке
$city=trim($region[$i+1]); // название города
$adr=trim($region[$i+2]); // адрес страницы
}
else {
}
}
// если у нас передается информация не номером города, а названием, то:
for ($i=0; $i<sizeof($region); $i++) {
$city=str_replace($city,"%20"," "); // заменяем "%20" на " "
if (trim($region[$i])==$city) { // ищем название города в списке
$adr=trim($region[$i+1]); // адрес страницы
}
else {
}
}
// Входная информация для дальнейшего кода - $adr (адрес страницы прогноза погоды для города на сайте http://weather.yahoo.com)/ и $city - название города на родном языке.
//
// фразы для поиска полезной информации. Оригинал фраз можно обнаружить на странице, например, этой, проанализировав код.
// здесь заводим в переменные фразы, по которым будем искать нужную информацию (градусы, описания погоды, картинки). Используем фразы до и после необходимой информации.
Этот блок в будущем придется изменять, когда на оригинале (weather.yahoo.com) изменится код страниц. На 14 авг. 2001 он работает.
$begin_screen='FORECAST ----'; // начальная фраза таблицы с прогнозом погоды
$end_screen='</b></td></tr></table></td></tr></table>'; // последняя фраза таблицы
$post_gradus='</font></b><'; // после градусов
$before_gradus='<font size="3" face="arial">'; // перед градусами
$before_image='http://us.i1.yimg.com/us.yimg.com/i/we/fc/'; // перед картинкой
$post_image='.gif'; // после картинки
$before_forecast='top><font face="arial" size="2">'; // перед фразой погоды
$post_forecast='</font></td><td>'; // после фразы погоды
// массивы для переводов даты и описаний погоды с английского языка на родной (в данном случае использован вариант перевода с буржуйского на язык, которым разговаривал Ленин.
"туман","день","ночь","ясно","дождь со снегом","дождь со снегом","мокрый снег","снег с дождем","снег","переменно"); // российские аналоги погоды
$brdcolor='#ffffff'; // цвет рамки таблицы прогноза (белый)
$bgcolor='#eeeeee'; //цвет фона ячеек таблицы (лучше - цвет фона страницы)
// А Здесь начинается код программы, который изменять не придется.
// занимаемся созданием даты, выводимой на экран.
Функция time() даст нам текущее время. Функцией date(d." ".M,$t[$i]) получаем дату текущего и последующих 4 дней, а date(D,$t[$i]) дает нам дни недели всех 5 дней. А затем переводим даты с английского языка на родной.
$t=array(4);
$d=array(4);
$dn=array(4);
for ($i=0; $i<=4; $i++) {
$t[$i]=time()+$i*86400;
$d[$i]=date(d." ".M,$t[$i]);
$dn[$i]=date(D,$t[$i]);
for ($j=0; $j<sizeof($endat); $j++) { // переводим слова в дате и получаем даты на родном языке
} // и получаем даты на языке, которым разговаривает наш нонешний Вова
}
// начинаем обрабатывать страницу.
// Выясняем строки начала и конца таблицы с прогнозом погоды. Затем, будем работать именно с этим блоком.
$screen=file($adr); // читаем страницу с прогнозом погоды в переменную $screen
for ($i=1; $i<sizeof($screen); $i++) { // обрабатываем строки с первой по последнюю
if (strpos($screen[$i],$begin_screen)==false) { //находим начало таблицы с прогнозом
if (strpos($screen[$i],$end_screen)==false) { //находим ее конец
}
else {$m=$i; // $m - номер последней строки таблицы
}
}
else {$k=$i; // $k - номер первой строки таблицы
}
} // Получаем с $screen[$k] по $screen[$m] - нашу таблицу с погодой. Потом будемработать именно с ней, чтобы не было лишних совпадений, и быстро работала программа.
// Можно ее выводить в "родном дизайне, но нам это не нравится
// Начинаем искать полезную информацию.
$grad=array(9); // массив из 10 чисел градусов температуры окружающей среды
$zed=0; // счетчик градусов
for ($i=$k; $i<=$m; $i++) { //работаем с градусами
if (strpos($screen[$i],$before_gradus,0)==false) { //если нет градусов в строке (если нет фразы, стоящей перед градусами.
}
else {// если есть градусы в строке
$string_grad=$screen[$i]; // сохраняем строку с градусами в переменную
$string_grad=explode($before_gradus,$string_grad); // разбиваем строку на массив строк по разделителю, которым является фраза перед градусами, таким образом, мы получаем в 1 элементе массива строку, которая начинается собственно с самого градуса погоды.
$end_grad=strpos($string_grad[1],$post_gradus,0); // определяем позицию начала фразы, идущей после градуса.
$grad[$zed]=substr($string_grad[1],0,$end_grad); // первый градус получаем, как подстрока, с 0-го символа до начала фразы после градуса.
$zed++; // инкремент счетчика градусов
$end_grad=strpos($string_grad[2],$post_gradus,0);
$grad[$zed]=substr($string_grad[2],0,$end_grad); // второй градус
$zed++; // инкремент счетчика градусов
}
} // в результате чего, мы получили все градусы на нашей странице
// переводим фаренгейты в цельсии
for ($i=0; $i<=9; $i++) {$grad[$i]=round(5/9*($grad[$i]-32));
}
// в варианте с забиранием информации со страницы с цельсиями
// эту строку стоит просто закомментировать. Я оставил так, просто каприз.
// переводим фаренгейты в цельсии
// находим слова погоды абсолютно аналогично поиску градусов
$zed=0; // счетчик описаний погоды
for ($i=$k; $i<=$m; $i++) { //работаем с описаниями
if (strpos($screen[$i],$before_forecast,0)==false) { //если нет описания погоды в строке
}
else {// если есть описания в строке
$string_grad=$screen[$i]; // сохраняем строку с описаниями в переменную
// картинки можно привязать к картинкам Яхи (названия аналогичных по погоде совпадают, как в моем случае), а можно сделать массивы соответствия слов-описаний погоды и Ваших картинок. Это по-желанию. Что долговечнее, трудно судить. И фразы-описания они могут изменить, и картинки переименовать. Можно, конечно договориться с админом Яхи, чтобы они не меняли один из этих элементов и отталкиваться от него, но у меня не было его телефона:о)
</td>
</tr>
</table>
Теперь программа работает, и ее можно вставлять в свой дизайн. Вот вариант: вышеупомянутая Ларнака
Если кого заинтересуют "вариации на тему" или возникнут вопросы, прошу писать мне totoeval@mtu-net.ru. А также, пишите все, кто сможет посоветовать другие варианты. Всегда рад критике и возможности повысить свой уровень.