初心者のための「PHPの配列」入門 ・その3
2008年02月19日13:06
RSSリーダーの多くは、各サイトごとにRSS情報がまとめられるものが多いのですが、むしろ、登録したサイトのRSS情報を全てごちゃ混ぜにして、時系列順で一覧にしてみたいのです。

はてなRSSリーダーはそういう仕様になっているので、センスがいいなあと思います。

今回は、そういう私の個人的なニーズにあったRSSリーダーを自作してみましょう。
(例:ごった煮RSSリーダー



その前にまず、今回扱うRSSについて説明させていただきます。
RSS1.0RSS2.0というのがあるのですが、はっきり言って、細かい事は私にも分りません。
ぶっちゃけ違いがあろうとなかろうとどうでもいいんですが、ただ、日付の表記が違うのだけは今回すごく痛いのです。


<日付の表記の差>

RSS1.0 ・・・ <dc:date>2008-02-19T01:38:04+09:00</dc:date>
RSS2.0 ・・・ <pubDate>Tue, 19 Feb 2008 01:38:04 +0900</pubDate>

(他、RSS1.0とRSS2.0の違いについて。)
RSS2.0の方が良いかもしれません… − [Z]ZAPAブロ〜グ2.0


これははっきり言って、RSS2.0の方が扱いづらい。
こちとら初心者で、日付の変換の方法もよくわかりませんので、今回潔くRSS2.0には対応いたしません

また、あんまり多くのフィードを読み込むとどれくらい負荷がかかるかも分りませんので、フィードは5個くらいにしておきます


RSS1.0のフィードを手動で5つくらい登録して時系列順に並び替えるRSSリーダーをつくります。


我ながら制約が多いRSSリーダーだな、オイ。
ま、いいか。


ポイントを列挙します。


1.1つめのRSSフィードを読み込んで配列にする。

2.配列から情報を抜き出し、「日付+リンク+サイト名」という形の文字列にする。

3.作った文字列を配列に入れ込む。

4.これをRSSフィードの数だけ繰り返す。

5.日付+リンク+サイト名という文字列を日付降順でソートする。

6.日付をトリミングして、ソートされた順にひとつの文字列にする。

7.文字列をキャッシュ。



結構長くなりそうですね。

とりあえず、1、2、3を今回ご説明させて頂き、4、5、6を次回、7を最終回にしましょうか。



それでは始めます。


1.1つめのRSSフィードを読み込んで配列にする。

前回のものをそのまま流用。

XML/Unserializer.phpを使用してますので、詳しいやり方は前回の記事をご参照下さい。

require_once("XML/Unserializer.php");
$xml_data = file_get_contents("rss.xml");
$options = array(
XML_UNSERIALIZER_OPTION_ATTRIBUTES_PARSE => 'parseAttributes'
);
$unserializer = new XML_Unserializer($options);
$unserializer->unserialize($xml_data);
$result = $unserializer->getUnserializedData();



深く考えずに、コピペとファイルのコピーで丸暗記。


2.配列から情報を抜き出し、「日付+リンク+サイト名」という形の文字列にする。

$result['channel']['title'] ・・・ サイト名
$result['item'][$i]['dc:date'] ・・・ 記事の日付
$result['item'][$i]['title'] ・・・ 記事のタイトル
$result['item'][$i]['link'] ・・・ 記事のアドレス



記事の日付 <a herf='記事のアドレス'>記事のタイトル</a> (サイト名)



という形にしたいのですが、変数以外の文字列はダブルクォーテーションでくくって、.(ドット)で連結します。

 $result['item'][$i]['dc:date']."&nbsp;<a href='".$result['item'][$i]['link']."' target='_blank'>".$result['item'][$i]['title']."</a>&nbsp;(".$result['channel']['title'].")<br />" 


&nbsp; は、スペースを入れるための特殊文字です。

target='_blank' は、リンクを別窓で開くためのもので、ダブルクォーテーションの中にある場合、シングルクォーテーションにします。

<br />は改行です。

長い命令文ですが、やっている事は単純です。
文字列はダブルクォーテーションでくくって、.(ドット)で連結、ただそれだけです。


これをRSSフィードの記事の数だけ繰り返さないといけません。

for($i=0; $i< count($result[item]); $i++){
$entry = $result['item'][$i]['dc:date']."&nbsp;<a href='".$result['item'][$i]['link']."' target='_blank'>".$result['item'][$i]['title']."</a>&nbsp;(".$result['channel']['title'].")<br />";
}




3.作った文字列を配列に入れ込む。

配列って、中身を順番に並び替えたりできるんです。
これを利用するために、作った文字列を新たな配列に入れ込んでおきます。

ここで、ちょっとした配列の小技をご紹介します。

$array[] = $hensu;

こういう風に書くと、配列$arrayの一番最後に、$hensuの中身を付け加えてくれます。



今回$datという配列に、文字列の変数$entryの中身を次々と加えていきます。
そして、あとでこれを日付順に並べ替えます。

for($i=0; $i< count($result[item]); $i++){
$entry = $result['item'][$i]['dc:date']."&nbsp;<a href='".$result['item'][$i]['link']."' target='_blank'>".$result['item'][$i]['title']."</a>&nbsp;(".$result['channel']['title'].")<br />";

$dat[] = $entry;
}




最終的にここまでのプログラムは下記のようになります。
当サイトのRSSで試してみます。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>RSSリーダーのテスト</title>
</head>
<body>
<?php
require_once("XML/Unserializer.php");
$xml_data = file_get_contents("http://afiliate.livedoor.biz/index.rdf");
$options = array(
XML_UNSERIALIZER_OPTION_ATTRIBUTES_PARSE => 'parseAttributes'
);
$unserializer = new XML_Unserializer($options);
$unserializer->unserialize($xml_data);
$result = $unserializer->getUnserializedData();

for($i=0; $i< count($result[item]); $i++){
$entry = $result['item'][$i]['dc:date']."&nbsp;<a href='".$result['item'][$i]['link']."' target='_blank'>".$result['item'][$i]['title']."</a>&nbsp;(".$result['channel']['title'].")<br />";

$dat[] = $entry;

}

?>
</body>
</html>



このプログラムで出来た配列$dat → ヴィジュアル的に見やすく表示したもの





clip!PHP 



この記事へのトラックバック


1. goo RSSリーダー  [ Web Surferの他愛もない日常 ]   2008年02月22日 12:42

自分は、ポータルサイトは、主にYahoo!JAPANや、Googleを使っているので、gooはあまり使っていなかったのだが、昨日、goo RSSリーダーをダウンロードしてみて、これは便利!と感じた。goo同様のポータルサイトで、楽天グループのinfoseekでも、infoseek RSSリーダーというRS...