ページの端っこの方に天気を表示させる機会があったので、
その方法を記録しておきます。
天気の情報はlivwdoorのAPIを使って取得します。
※取得するエリアは東京都のものになります。
で、
ソースは調べれば結構出てくるので、
他の方が紹介してくれているソースをコピーして改良しただけですが、
以下のようにすれば大丈夫です。
<?php
$city_cd = "63"; //東京都のコード
$xml = "http://weather.livedoor.com/forecast/webservice/rest/v1?city={$city_cd}"; //APIのURL
$html = "";
$html .= "<table align=\"center\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" height=\"auto\">\n";
$html .= "<tr>\n";
$html .= "<td colspan=\"3\" style=\"text-align:center;\">";
//場所情報を取得
$obj = simplexml_load_file($xml);
$html .= "【<span style=\"font-weight:bold;\">" . $obj->location->attributes()->pref . "の天気</span>】";
$html .= "</td>";
$html .= "</tr>\n";
$html .= "<tr>\n";
//当日の天気
$obj = simplexml_load_file($xml . "&day=today");
$html .= getDateWeather($obj);
//明日の天気
$obj = simplexml_load_file($xml . "&day=tomorrow");
$html .= getDateWeather($obj);
//明後日の天気
$obj = simplexml_load_file($xml . "&day=dayaftertomorrow");
$html .= getDateWeather($obj);
$html .= "</tr>\n";
$html .= "</table>\n";
echo $html;
//天気を取得
function getDateWeather($obj){
$html .= "<td style=\"text-align:center;line-height:1.4em;font-size:14px;padding-top:5px;\">";
$html .= "<div>" . date_format(new DateTime($xml->forecastdate), "m/j") . "</div>";
$html .= "<div>" . $obj->day . "</div>";
$html .= "<div><img src=\"" . $obj->image->url . "\" width=\"" . $obj->image->width . "\" height=\"" . $obj->image->height . "\" alt=\"" . $obj->image->title . "\"></div>";
$html .= "<div style=\"margin:0px 15px;\">" . $obj->telop . "</div>";
//最低気温
$minTemp = ($obj->temperature->min->celsius > 0) ? $obj->temperature->min->celsius : "-";
//最高気温
$maxTemp = ($obj->temperature->max->celsius > 0) ? $obj->temperature->max->celsius : "-";
$html .= "<div>" . $minTemp . " ~ " . $maxTemp . "℃</div>";
$html .= "</td>\n";
return $html;
}
?>
やっていることを説明すると、
まず、
http://weather.livedoor.com/forecast/webservice/rest/v1
のURLに対して、
天気を取得したいエリアのコード(city)と取得したい日(day)のパラメータをくっつけてクエリを作成してやります。
今回は、
日付けのパラメータ(day)にはそれぞれtoday、tomorrow、dayaftertomorrowを設定して、
3日分の天気を表示させています。
あとは、
そのクエリで取得できるXMLのデータを
simplexml_load_file()でパースすれば、
<table>などでデザインだけ整形して表示させてやるだけです。
因みに、
以下の様にすることで、
各地域の天気情報ページヘのリンクを作成することも可能です。
<?php
$city_cd = "63"; //東京都のコード
$xml = "http://weather.livedoor.com/forecast/webservice/rest/v1?city={$city_cd}"; //APIのURL
$html = "";
$obj = simplexml_load_file($xml);
$html = getCityWeather($obj);
echo $html;
//天気を取得
function getDateWeather($obj){
$html .= "<td style=\"text-align:center;line-height:1.4em;font-size:14px;padding-top:5px;\">";
$html .= "<div>" . date_format(new DateTime($xml->forecastdate), "m/j") . "</div>";
$html .= "<div>" . $obj->day . "</div>";
$html .= "<div><img src=\"" . $obj->image->url . "\" width=\"" . $obj->image->width . "\" height=\"" . $obj->image->height . "\" alt=\"" . $obj->image->title . "\"></div>";
$html .= "<div style=\"margin:0px 15px;\">" . $obj->telop . "</div>";
//最低気温
$minTemp = ($obj->temperature->min->celsius > 0) ? $obj->temperature->min->celsius : "-";
//最高気温
$maxTemp = ($obj->temperature->max->celsius > 0) ? $obj->temperature->max->celsius : "-";
$html .= "<div>" . $minTemp . " ~ " . $maxTemp . "℃</div>";
$html .= "</td>\n";
return $html;
}
//各地の天気
function getCityWeather($obj){
//1列辺りの<td>の数
$num = 8;
$html .= "<table align=\"center\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" height=\"auto\">\n";
$html .= "<tr>\n";
$html .= "<td colspan=\"{$num}\" style=\"text-align:center;padding-top:15px;\">【<span style=\"font-weight:bold;\">各地の天気</span>】</td>";
$html .= "</tr>\n";
$html .= "<tr>\n";
$i = 1;
foreach($obj->pinpoint->location as $val){
$html .= "<td>【<a href=\"" . $val->link . "\" target=\"_blank\">" . $val->title . "</a>】</td>\n";
if(($i % $num) == 0) $html .= "</tr>\n<tr>\n";
$i++;
}
if(($i % $num) != 0){
for($i = 0; $i < ($num - $i - 1); $i++){
$html .= "<td></td>\n";
}
}
$html .= "</tr>\n";
$html .= "</table>\n";
return $html;
}
?>
何をやってるかは調べてみて下さい。
この記事へのコメントはありません。