Пример предназначен для тех, кто начинает работать с php, и не только
для них.
Результатом работы программы(скрипта) является прогноз погоды на 5 дней
для любого, интересующего Вас города, выводимый в виде, который нравится
именно Вам, а не дизайнерам сайта-донора.
Информация в таких случаях берется с известных серверов прогноза погоды
(где не пишут фразу "запрещено использование информации" и т.п.). В данном
случае используется сервер http://weather.yahoo.com , на котором есть
страницы с погодой для довольно большого количества городов, и практически
всегда можно найти если не интересующий Вас город, то ближайший ему и
идентичный по погодным условиям.
Единственным недостатком является лишь то, что админу приходится
вводить в текстовый файл (возможен вариант с mysql, но в том случае мне
было проще сделать в файле) название населенного пункта на родном языке и
ссылку на страницу с прогнозом погоды на него на сервере Yahoo. Но никто за
Вас этого делать не будет.
Выводим на экран форму с паролем pass. В окне вводятся: номера названия
ссылки Затем, после нажатия на кнопку и проверки пароля, записываем новый
список в файл.
Если у нас не текстовый файл, а mysql, то все проще.
<table width=100%
border=0 cellspacing=0 cellpadding=2 bgcolor=<? echo $brdcolor;
?>>
<tr>
<td>
<br>
<!----------------------- FORECAST
------------------------->
<?php
$ini=$DOCUMENT_ROOT.'/weather/weather.ini';
$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>'; //
после фразы погоды
// массивы для переводов
даты и описаний погоды с английского языка на родной
(в данном случае
использован вариант перевода с буржуйского на язык,
которым разговаривал Ленин.
$endat=array("
","Mon","Tue","Wed","Thu","Fri","Sat","Sun",
"May","Jul","Jun","Aug","Sep","Oct","Nov","Dec","Jan","Feb","Mar","Apr");
// английские даты
$rudat=array("
","понедельник","вторник","среда","четверг","пятница",
"суббота","воскресенье","мая","июля","июня","августа","сентября","октября",
"ноября","декабря","января","февраля","марта","апреля"); //
родные даты
$eng=array("
","Thunderstorms","Sunny","Partly Cloudy","Showers","Rain",
"Mostly
Cloudy","Tstorms","Drizzle","Cloudy","Flurries","Fog","High",
"Low","Clear","Sleet","Rain/snow","Snow Showers","Mixed
Snow", "Rain",
"Snow","Mixed"); //
английские описания погоды
$rus=array("
","гроза","ясно","переменная облачность","ливень","дожди",
"облачно","гроза","изморось","пасмурно","снегопад","туман","день","ночь",
"ясно","дождь со
снегом","дождь со снегом","мокрый снег","снег с дождем",
"снег","переменно"); //
российские аналоги погоды
$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++) { // переводим слова в дате
и получаем даты на родном
языке
$d[$i]=str_replace($endat[$j],$rudat[$j],$d[$i]);
$dn[$i]=str_replace($endat[$j],$rudat[$j],$dn[$i]);
} // и получаем даты на
языке, которым разговаривает наш нонешний Вова
}
// начинаем обрабатывать
страницу.
// Выясняем строки начала и
конца таблицы с прогнозом погоды.
Затем, будем работать
именно с этим блоком.
$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];
// сохраняем строку с описаниями в переменную
$string_grad=explode($before_forecast,$string_grad);
$end_grad=strpos($string_grad[1],$post_forecast,0);
$forec[$zed]=substr($string_grad[1],0,$end_grad);
for ($j=0;
$j<sizeof($eng); $j++) { // перебираем все варианты
слов в описаниях
$forec[$zed]=str_replace($eng[$j],$rus[$j],$forec[$zed]); //
переводим слова
}
$zed++; // инкремент
счетчика описаний
}
} // в результате чего, мы
получили все описания погоды на нашей странице
$zed=0; // счетчик слов
картинок аналогично
for ($i=$k; $i<$m; $i++)
{ //работаем с картинками
if
(strpos($screen[$i],$before_image,0)==false) {
//если нет описания погоды
в строке
}
else {// если есть картинки
в строке
$string_grad=$screen[$i];
// сохраняем строку с картинками в переменную
$string_grad=explode($before_image,$string_grad);
$end_grad=strpos($string_grad[1],$post_image,0);
$for_img[$zed]=substr($string_grad[1],0,$end_grad);
$zed++; // инкремент
счетчика картинок
}
} // в результате чего, мы
получили все картинки на нашей странице
?>
// публикуем результаты:
<table width=100%
cellpadding=0 cellspacing=0 border=0>
<tr><td width=20%
align=center><font size=3><b
><? echo $city; //
выводим название города, для которого
отображается прогноз погоды
?></b><br></font></td></tr></table
><table width=100%
cellpadding=0 cellspacing=0 border=0>
<tr><?
for ($i=0; $i<=4; $i++)
{ // выводим на экран ячейки с датами и днями
echo "<td width=20%
align=center><font size=2><b>
$d[$i]<br>$dn[$i]</b></font></td>";
}
?></tr
></table
><table width=100%
cellpadding=0 cellspacing=0 border=0 bgcolor=<?
echo $brdcolor; ?>
><tr><td
><table width=100%
cellpadding=2 cellspacing=1 border=0
><tr><?
$zed=0; // счетчик
выводимых градусов
for ($i=0; $i<=4; $i++)
{ // выводим ячейки с прогнозами - картинки, градусы, описания
$zed1=$zed+1;
echo "<td width=20%
align=center bgcolor=$bgcolor
valign=middle><img
src=../pic/".$for_img[$i].".gif border=0
alt=".$forec[$i]."><br><br><
font
size=2>".$forec[$i]."</font><br><br><
font
size=3><b>".$grad[$zed]."°C<br>".$grad[$zed1]."°C</b>
</font></td>";
$zed=$zed+2;
}
?>
</tr></table>
// картинки можно привязать
к картинкам Яхи
(названия аналогичных по
погоде совпадают, как в моем случае),
а можно сделать массивы
соответствия слов-описаний погоды и Ваших картинок.
Это по-желанию. Что
долговечнее, трудно судить. И фразы-описания они могут
изменить, и картинки
переименовать. Можно, конечно договориться с админом Яхи,
чтобы они не меняли один из
этих элементов и отталкиваться от него, но у меня
не было его телефона:о)
</td>
</tr>
</table>
Теперь программа работает, и ее можно вставлять в свой дизайн. Вот
вариант: вышеупомянутая Ларнака
Если кого заинтересуют "вариации на тему" или возникнут вопросы, прошу
писать мне totoeval@mtu-net.ru. А также, пишите
все, кто сможет посоветовать другие варианты. Всегда рад критике и
возможности повысить свой уровень.
У Вас будут на экране все картинки, используемые Yahoo. Если хотите,
используйте их. Если нет, то сделайте свои и назовите соответственно
оригиналам. Картинки размещаются (в моем варианте) по пути ../pic/ от
Вашего скрипта. Если не нравится - замените путь на свой.
Надо создать таблицу. поля таблицы:
При работе программ, вместо поиска в файле, делать запросы в базу по
этим полям.