Помогите с парсером погоды

Переформулирую вопрос:
есть условный код XML:
PHP:
<day date="2019-09-28">
  <moonset>00:19</moonset> 
- <day_part typeid="1" type="morning">
  <wind_speed>1</wind_speed> 
  </day_part>
- <day_part typeid="2" type="day">
  <wind_speed>2</wind_speed> 
  </day_part>
Я могу без особых проблем получить данные <moonset> или данные <day_part typeid="1"> -> <wind_speed>1</wind_speed>, но не получается взять данные из <day_part typeid="2"> -> <wind_speed>2</wind_speed>.
Понимаю, что нужно чуть-чуть доработать код, но не знаю как... Может хуть с этим сможете помочь, с остальным - разобрался :)
Код, который использую:
*** скрытое содержание ***
PHP:
foreach ($res1 -> day as $day)
{
	foreach ($day -> day_part as $arr)
	{
		print_r ($arr);
		print '<br /><br />';
	}
}

И далее соответственно доступ к любому необходимому свойству.
Разберешься?
 
Эм.. может кто-нибудь исправить ? :)
 
Недавно наткнулся на очередной способ парсинга с gismeteo с помощью javascript и php. Может кому-то будет интересен
 
А какой из парсеров меньше загружает серв, ява или пхп?
 
Перечитал много тем про парсинг погоды, но так и не нашел про сервис rp5.ru, а ведь хорошая штука!

Кроме этого у меня есть когда-то писанный на заказ (я к сожалению не кодер) парсер. Сначала он был на fopen, потом хостер отключил функцию и пришлось переписывать его на cure.

Он рабочий..но немного кривоват. Возможно ли подправить и всенародно юзать его, исходник предоставлю.
 
Curl
Картинки не ложу, если кому надо напишите в личку.

PHP:
<?php
$main = array();

$city = (isset($city))? $city : 247;
$r_time = 7200;					// время кеширования скачиваемых данных (в секундах)
$tmp	= 'weather.xml';	    // временный файл

$url	= 'http://rp5.ua/xml.php?id='.$city ; 

$month=array(
	'1' => 'января',
	'2' => 'февраля',
	'3' => 'марта',
	'4' => 'апреля',
	'5' => 'мая',
	'6' => 'июня',
	'7' => 'июля',
	'8' => 'августа',
	'9' => 'сентября',
	'10' => 'октября',
	'11' => 'ноября',
	'12' => 'декабря'
	);


$no_answer=false;
$error_srv=false;

$life_time = time() - @filemtime($tmp);
if ((file_exists($tmp)) && ($life_time<$r_time) && (filesize($tmp)>1000))
{
	$fp = @fopen($tmp, 'r');
	if (filesize($tmp) > 0){
    	    $text = @fread($fp, filesize($tmp));
	    if (strlen($text) > 100) $xml_answer=$text;
	}else{
    	    $text = '';
	    $no_answer=true;
	}
	fclose($fp);
}else{
    $RetrieveFile='';
	
    /*$OpenFile = fopen($url, "r", true);
    if (fsockopen('rp5.ru', '80', $errno, $errstr, 2) && $OpenFile)
    {
        while(!@feof($OpenFile)) {
    	    $RetrieveFile.=@fread($OpenFile, 1498);
	}
	@fclose($OpenFile);*/
	
	if ($handle = curl_init()){
  curl_setopt($handle, CURLOPT_URL, "http://rp5.ua/xml.php?id=247");
  curl_setopt($handle, CURLOPT_FAILONERROR, 1);
  curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
/*  curl_setopt($handle, CURLOPT_POST, 1);
  curl_setopt($handle, CURLOPT_POSTFIELDS, $doc);*/

  $RetrieveFile = curl_exec($handle);
  
	@unlink($tmp);
	$fp = @fopen($tmp, 'w');
	if ($fp){
	    fwrite($fp, $RetrieveFile);
    	    fclose($fp);
	}
    }else{
	$no_answer=true;
    }
    $xml_answer=$RetrieveFile;
}

if (false == $no_answer) {
    $xml_answer=rawurldecode($xml_answer);
    $p=xml_parser_create();
    xml_parse_into_struct($p,$xml_answer,&$val,&$index);
    xml_parser_free($p);
	
    $created = $val[0]["attributes"]["CREATED"];
    $date	 = $val[0]["attributes"]["DATE"];

    $t_day=date('d')+0;
    $t_month=date('m')+0;
    $t_year=date('Y')+0;
    $dt0=$t_year.$t_month.$t_day;
    //$today=`date '+%Y-%m-%d'`;

  foreach ($val as $v){
    if ($v['tag'] == 'ERROR') 
    {
	$error_srv = true;
	$error_from_srv = $v['value'];
    }
	if ($v['tag'] == 'POINT_ID') $point_id = $v['value'];			// ID НП в базе сайта
	if ($v['tag'] == 'REGION_ID') $region_id = $v['value'];			// ID региона, в котором находится НП
	if ($v['tag'] == 'COUNTRY_ID') $country_id = $v['value'];		// ID страны, в которой находится НП
	if ($v['tag'] == 'POINT_NAME') $point_name = $v['value'];		// полное наименование НП. Например, "Дубровка (Дубровский р-н)"
	if ($v['tag'] == 'POINT_NAME_TRIM') $point_name_trim = $v['value'];	// сокращенное наименование НП без скобок. Например, "Дубровка". 
										// point_name_trim соответствует point_name до открывающейся скобки.
	                							// Если скобки нет, то point_name_trim = point_name.
	if ($v['tag'] == 'POINT_NAME2') $point_name2 = $v['value'];		// название НП в предложном падеже с предлогом. Например, "в Дубровке".
										// Используется в заголовках вида "Погода в Дубровке" ("Погода " + point_name2)
	if ($v['tag'] == 'POINT_TIMESTAMP') $point_timestamp = $v['value'];	// unix-таймстамп даты в НП
	if ($v['tag'] == 'GMT_ADD') $gmt_add = $v['value'];			// GMT-смещение в часах с учетом перехода на летнее-зимнее время
	if ($v['tag'] == 'POINT_DATE') $point_date = $v['value'];		// местное время в НП в момент запуска скрипта с указанием gmt_add.
										// Например, "Sun, 12 Dec 2004 13:00:25 +0300"
	if ($v['tag'] == 'POINT_DATE_TIME') $point_date_time = $v['value'];	// местное время в НП в момент запуска скрипта. Используется менее 
										// подробный формат. Например, "2004-12-12 13:00"

	if ($v['tag'] == 'TIME_STEP') $time_step = $v['value'];
	$tag[$time_step][$v['tag']]   = $v['tag'];
	$value[$time_step][$v['tag']] = $v['value'];

	if ($v['tag'] == 'DATETIME') {
	    $ts[] = $time_step;
	    $dt_ = explode(" ",$v['value']);
	    $dt_ = explode("-",$dt_[0]);
	    $dt=$dt_[0].$dt_[1].$dt_[2];
	    $value[$time_step]['dt_t']=gmdate("d M",mktime(0,0,0,$dt_[1],$dt_[2],$dt_[0]));
	    $value[$time_step]['dt_d']=$dt_[2];
	    $value[$time_step]['dt_m']=$dt_[1];
	    $r=$dt - $dt0;
	    if ($r == 0) {
		$value[$time_step]['dt'] = "Сегодня";
	    } else if ($r == 1) {
		$value[$time_step]['dt'] = "Завтра";
	    } else if ($r == 2) {
		$value[$time_step]['dt'] = "Послезавтра";
	    }
	}
	if ($v['tag'] == 'G' && ($v['value'] < 11 && $v['value'] > 0)) {
	    $value[$time_step]['night'] = 1;
	    $value[$time_step]['bgcolor'] = "#001389";
	    $value[$time_step]['dt_n'] = "ночью";
	} else if ($v['tag'] == 'G' && ($v['value'] < 23 || $v['value'] > 11)) {
	    $value[$time_step]['night'] = 0;
	    $value[$time_step]['bgcolor'] = "#026EFE";
	    $value[$time_step]['dt_n'] = "днем";
	}
  }

/* Описание полей с данными
point_id 	- ID НП в базе сайта
region_id 	- ID региона, в котором находится НП
country_id 	- ID страны, в которой находится НП
point_name 	- полное наименование НП. Например, "Дубровка (Дубровский р-н)"
point_name_trim - сокращенное наименование НП без скобок. Например, "Дубровка". point_name_trim соответствует point_name 
		  до открывающейся скобки. Если скобки нет, то point_name_trim = point_name.
point_name2 	- название НП в предложном падеже с предлогом. Например, "в Дубровке". Используется в заголовках вида 
		  "Погода в Дубровке" ("Погода " + point_name2)
point_timestamp - unix-таймстамп даты в НП
gmt_add 	- GMT-смещение в часах с учетом перехода на летнее-зимнее время
point_date 	- местное время в НП в момент запуска скрипта с указанием gmt_add. 
		  Например, "Sun, 12 Dec 2004 13:00:25 +0300"
point_date_time - местное время в НП в момент запуска скрипта. Используется менее подробный формат. 
		  Например, "2004-12-12 13:00"
time_step 	- смещение указанного ниже момента прогноза (datetime) в часах относительно 0 час Гринвичского времени 
		  в день составления прогноза. time_step соответствует русскому термину "заблаговременность прогноза". 
		  Например, если time_step = 48 - это прогноз на момент времени, отстоящий на 48 часов от момента 
		  составления прогноза (0 ГМТ).
datetime 	- момент прогноза по местному времени (дата час:минута)
G 		- момент прогноза по местному времени в часах. Например, "15".
HHii 		- момент прогноза по местному времени в часах и минутах. Например, "15:00"
cloud_cover 	- облачность (%)
precipitation 	- толщина осадков (мм), накопленных в течение 4 часов перед указанным выше моментом времени. 
		  Например, если G = 15 час, то осадки накапливались с 11 до 15 час. Таким образом, при визуализации 
		  значение осадков - в отличие от всех остальных параметров - лучше располагать между соседними 
		  моментами времени.
pressure 	- атмосферное давление (мм. рт. ст.)
temperature	- температура воздуха (град. Цельсия)
humidity 	- относительная влажность воздуха (%)
wind_direction 	- направление ветра (С-северный, СВ-северо-восточный и т.д.). Направление указывает ОТКУДА дует ветер. 
		  Например, северный ветер дует с севера.
wind_velocity 	- скорость ветра (м/сек)
falls 		- тип осадков (0 - отсутствие осадков, 1 - дождь, 2 - дождь со снегом, 3 - снег)
drops 		- коэффициент количества снежинок или капель дождя для визуализации. 
		  Возможные значения: 0.5, 1, 2, 3, 4, 5, 6, 7, 8. На сайте rp5.ru drops умножается на 2. 
		  Тогда при drops = 0.5 нужно изобразить одну каплю или снежинку, 
		  при drops = 8 - шестнадцать капель или снежинок. */

/*	echo "<hr width=\"220\" align=\"left\">";
	echo $tag[0]['TIME_STEP']." = ".$value[$ts[0]]['TIME_STEP']."<br>";
	echo $tag[0]['DATETIME']." = ".$value[$ts[0]]['DATETIME']."<br>";
	echo $tag[0]['G']." = ".$value[$ts[0]]['G']."<br>";
	echo $tag[0]['HHII']." = ".$value[$ts[0]]['HHII']."<br>";
	echo $tag[0]['CLOUD_COVER']." = ".$value[$ts[0]]['CLOUD_COVER']."<br>";
	echo $tag[0]['PRECIPITATION']." = ".$value[$ts[0]]['PRECIPITATION']."<br>";
	echo $tag[0]['PRESSURE']." = ".$value[$ts[0]]['PRESSURE']."<br>";
	echo $tag[0]['TEMPERATURE']." = ".$value[$ts[0]]['TEMPERATURE']."<br>";
	echo $tag[0]['HUMIDITY']." = ".$value[$ts[0]]['HUMIDITY']."<br>";
	echo $tag[0]['WIND_DIRECTION']." = ".$value[$ts[0]]['WIND_DIRECTION']."<br>";
	echo $tag[0]['WIND_VELOCITY']." = ".$value[$ts[0]]['WIND_VELOCITY']."<br>";
	echo $tag[0]['FALLS']." = ".$value[$ts[0]]['FALLS']."<br>";
	echo $tag[0]['DROPS']." = ".$value[$ts[0]]['DROPS']."<br>";
	echo "<hr width=\"220\" align=\"left\">";

    echo "POINT_ID = ".$point_id."<br>";
    echo "REGION_ID = ".$region_id."<br>";
    echo "COUNTRY_ID = ".$country_id."<br>";
    echo "POINT_NAME = ".$point_name."<br>";
    echo "POINT_NAME_TRIM = ".$point_name_trim."<br>";
    echo "POINT_NAME2 = ".$point_name2."<br>";
    echo "POINT_TIMESTAMP = ".$point_timestamp."<br>";
    echo "GMT_ADD = ".$gmt_add."<br>";
    echo "POINT_DATE = ".$point_date."<br>";
    echo "POINT_DATE_TIME = ".$point_date_time."<br>";
*/

    $main['point_name']  = $point_name;
    $main['point_name2'] = $point_name2;

    $main['dt_d0'] = $value[$ts[0]]['dt_d'];
    $main['dt_m0'] = $month[$value[$ts[0]]['dt_m']];
    $main['dt_n0'] = $value[$ts[0]]['dt_n'];

    $main['dt_d1'] = $value[$ts[1]]['dt_d'];
    $main['dt_m1'] = $month[$value[$ts[1]]['dt_m']];
    $main['dt_n1'] = $value[$ts[1]]['dt_n'];

    $main['dt_d2'] = $value[$ts[2]]['dt_d'];
    $main['dt_m2'] = $month[$value[$ts[2]]['dt_m']];
    $main['dt_n2'] = $value[$ts[2]]['dt_n'];

    $main['dt_d3'] = $value[$ts[3]]['dt_d'];
    $main['dt_m3'] = $month[$value[$ts[3]]['dt_m']];
    $main['dt_n3'] = $value[$ts[3]]['dt_n'];

    $main['bgcolor0'] = $value[$ts[0]]['bgcolor'];
    $main['bgcolor1'] = $value[$ts[1]]['bgcolor'];
    $main['bgcolor2'] = $value[$ts[2]]['bgcolor'];
    $main['bgcolor3'] = $value[$ts[3]]['bgcolor'];
	
    $main['icons0'] = "<img src=\"../pogoda/images/".$value[$ts[0]]['night'].
	($value[$ts[0]]['FALLS'] == 0 && $value[$ts[0]]['CLOUD_COVER'] >= 60 ? '4' : ($value[$ts[0]]['PRECIPITATION'] >= 2 ? $value[$ts[0]]['FALLS'] : '0')).".gif\" width=\"60\" height=\"20\">";

    $main['icons1'] = "<img src=\"../pogoda/images/".$value[$ts[1]]['night'].
	($value[$ts[1]]['FALLS'] == 0 && $value[$ts[1]]['CLOUD_COVER'] >= 60 ? '4' : ($value[$ts[0]]['PRECIPITATION'] >= 2 ? $value[$ts[1]]['FALLS'] : '0')).".gif\" width=\"60\" height=\"20\">";

    $main['icons2'] = "<img src=\"../pogoda/images/".$value[$ts[2]]['night'].
	($value[$ts[2]]['FALLS'] == 0 && $value[$ts[2]]['CLOUD_COVER'] >= 60 ? '4' : ($value[$ts[0]]['PRECIPITATION'] >= 2 ? $value[$ts[2]]['FALLS'] : '0')).".gif\" width=\"60\" height=\"20\">";

    $main['icons3'] = "<img src=\"../pogoda/images/".$value[$ts[3]]['night'].
	($value[$ts[3]]['FALLS'] == 0 && $value[$ts[3]]['CLOUD_COVER'] >= 60 ? '4' : ($value[$ts[0]]['PRECIPITATION'] >= 2 ? $value[$ts[3]]['FALLS'] : '0')).".gif\" width=\"60\" height=\"20\">";

    $main['temperature0'] = $value[$ts[0]]['TEMPERATURE'];
    $main['temperature1'] = $value[$ts[1]]['TEMPERATURE'];
    $main['temperature2'] = $value[$ts[2]]['TEMPERATURE'];
    $main['temperature3'] = $value[$ts[3]]['TEMPERATURE'];

    $main['pressure0'] = $value[$ts[0]]['PRESSURE'];
    $main['pressure1'] = $value[$ts[1]]['PRESSURE'];
    $main['pressure2'] = $value[$ts[2]]['PRESSURE'];
    $main['pressure3'] = $value[$ts[3]]['PRESSURE'];

    $main['humidity0'] = $value[$ts[0]]['HUMIDITY'];
    $main['humidity1'] = $value[$ts[1]]['HUMIDITY'];
    $main['humidity2'] = $value[$ts[2]]['HUMIDITY'];
    $main['humidity3'] = $value[$ts[3]]['HUMIDITY'];

    $main['wind_dir0'] = $value[$ts[0]]['WIND_DIRECTION'];
    $main['wind_vel0'] = $value[$ts[0]]['WIND_VELOCITY'];
    $main['wind_dir1'] = $value[$ts[1]]['WIND_DIRECTION'];
    $main['wind_vel1'] = $value[$ts[1]]['WIND_VELOCITY'];
    $main['wind_dir2'] = $value[$ts[2]]['WIND_DIRECTION'];
    $main['wind_vel2'] = $value[$ts[2]]['WIND_VELOCITY'];
    $main['wind_dir3'] = $value[$ts[3]]['WIND_DIRECTION'];
    $main['wind_vel3'] = $value[$ts[3]]['WIND_VELOCITY'];

}
if (true == $no_answer || true == $error_srv)
{
    $main['no_data'] = 1;
    $main['error'] = _MD_WRP5_NO_ANSWER;
    $main['error_from_srv'] = $error_from_srv;
}

print("");
if ($main[no_data] == 1) {
print("<center><h5><$main[error]></h5><b><$main[error_from_srv]></b></center>");
}
else{
print("<center>
  <table cellpadding='5' cellspacing='1' border='0' width='500' class='weather' bgcolor='#cccccc'>
    <tr align='center' bgcolor='#f0f0f0'>
	<td><b><h3>$main[point_name]</h3></b></td>
	<td><b>$main[dt_d0] $main[dt_m0]<br>$main[dt_n0]</b></td>
	<td><b>$main[dt_d1] $main[dt_m1]<br>$main[dt_n1]</b></td>
	<td><b>$main[dt_d2] $main[dt_m2]<br>$main[dt_n2]</b></td>
	<td><b>$main[dt_d3] $main[dt_m3]<br>$main[dt_n3]</b></td>
    </tr>
	<tr bgcolor='#ffffff'>
	<td><b>Погода</b></td>
	<td align='center' bgcolor='$main[bgcolor0]'> $main[icons0]</td>
	<td align='center' bgcolor='$main[bgcolor1]'> $main[icons1]</td>
	<td align='center' bgcolor='$main[bgcolor2]'> $main[icons2]</td>
	<td align='center' bgcolor='$main[bgcolor3]'> $main[icons3]</td>
    </tr>
	<tr bgcolor='#ffffff'>
	<td><b>Температура <sup>o</sup>C</b></td>
	<td align='center'>$main[temperature0]</td>
	<td align='center'>$main[temperature1]</td>
	<td align='center'>$main[temperature2]</td>
	<td align='center'>$main[temperature3]</td>
    </tr>
	<tr bgcolor='#ffffff'>
	<td><b>Давление, мм</b></td>
	<td align='center'>$main[pressure0]</td>
	<td align='center'>$main[pressure1]</td>
	<td align='center'>$main[pressure2]</td>
	<td align='center'>$main[pressure3]</td>
    </tr>
	<tr bgcolor='#ffffff'>
	<td><b>Влажность %</b></td>
	<td align='center'>$main[humidity0]</td>
	<td align='center'>$main[humidity1]</td>
	<td align='center'>$main[humidity2]</td>
	<td align='center'>$main[humidity3]</td>
    </tr>
	<tr bgcolor='#ffffff'>
	<td><b>Ветер</b></td>
	<td align='center'>$main[wind_dir0]<br>$main[wind_vel0] м/с</td>
	<td align='center'>$main[wind_dir1]<br>$main[wind_vel1] м/с</td>
	<td align='center'>$main[wind_dir2]<br>$main[wind_vel2] м/с</td>
	<td align='center'>$main[wind_dir3]<br>$main[wind_vel3] м/с</td>
    </tr>
	</table></center>
	<p align='center' style='text'><b>
  Прогноз погоды любезно предоставлен <a href='http://rp5.ru/town.php?id=$pid' target='_blank'>rp5.ru</a><br>
  
  </font></b>");
	}
?>

В общем раньше экспортил при помощи fopen потом fopen на хостинге закрыли переделывался под curl. В самом коде есть закоментированные строки от fopen и всякие мелочи.
Скрипт рабочий, только есть небольшие глюки с кодировкой (название населенного пункта и указание ветра, северный, южный - глючит).
 
Неужели ни кому не интересно и у всех вопрос закрыт? :)
 
Назад
Сверху