初心者のための「PHPの配列」入門 ・その4
2008年02月20日23:40
RSS1.0のフィードを5個くらい読むというアバウトなRSSリーダー作成の記事の続きです。
前回の記事 → 初心者のための「PHPの配列」入門 ・その3

読んでいる人がいるのか激しく不安なので、そろそろ次回で終わりのこのシリーズ。
早速、先に進みましょう。



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

RSSリーダーであれば、出来れば一つではなく、いくつかのRSSフィードを読みたいわけです。
$rssという配列を準備して、ここにRSSフィードのアドレスを書き込みます。

$rss = array("rss.xml","rss2.xml","rss3.xml","rss4.xml","rss5.xml");


それぞれのRSSフィードに対して前回のプログラムを実行すれば、全てのフィードの記事の日付と記事へのリンクとブログタイトルを含んだ配列が出来るわけです。

フィードがあるかぎり繰り返しを続ければいいのですが、それを実現する命令文があります。

それが foreach 文です。


foreach文は、配列の中身がある限り繰り返しを続けます

書き方は、下のようになります。


$array = array("太郎","次郎","三郎");

foreach($array as $value){
echo $value;
}


上の例では、$arrayという配列を作り、中身を$valueという変数に入れながら、中身がなくなるまでechoで表示するということを繰り返し続けます。
$valueという変数名は、適当(てけとー)でかまいません。仮に作る変数と思ってもらっていいです。

上の命令文を実行すると、

太郎次郎三郎


と表示されます。


RSSフィードの数だけ繰り返しをしたいのであれば、

$rss = array("rss.xml","rss2.xml","rss3.xml","rss4.xml","rss5.xml");

foreach($rss as $value){
ここに$valueを利用した命令文を書く;
}


「ここに$valueを利用した命令文を書く」と言うところに、前回のプログラムをそのまま入れ込めばいいわけです。


<?php

$rss = array("rss.xml","rss2.xml","rss3.xml","rss4.xml","rss5.xml");

foreach($rss as $value){


require_once("XML/Unserializer.php");
$xml_data = file_get_contents($value);
$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;

}

}

?>



配列$datの中身をヴィジュアル的に表示したもの


RSSフィードを読み込んだ順に、配列の中身が並んでいます。



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

配列の中身の先頭には、日付がついています。
これを昇順に並べると、古いものが上の方に来てしまいます。
新しいものを上の方に並べたいので、降順で配列の中身を並び替えたいのです。

配列の中身を降順に並べ替える命令文が、rsort 文です。
ちなみに配列の中身を昇順に並べ替える命令文が、sort 文です。

命令文は下のように書きます。

rsort($dat);


早速、プログラムに加えてみます。


<?php

$rss = array("rss.xml","rss2.xml","rss3.xml","rss4.xml","rss5.xml");

foreach($rss as $value){

require_once("XML/Unserializer.php");
$xml_data = file_get_contents($value);
$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;

}

}

rsort($dat);

?>



→ 配列$datの中身をヴィジュアル的に表示したもの

RSSを日付降順に並び替えた配列の中身が並んでいます。



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


RSS1.0の日付の形式は、下のようになっているものがあります。

2008-01-11T22:34:22+09:00

T と、 +09:00 がすげえ邪魔です。

邪魔なので、取り去ってしまいましょう。
文字列の置き換えをする str_replace 文というのを使います。


str_replace("置き換え前の文字列","置き換え後の文字列","置き換えする文字列")


これをプログラムに当てはめて、T と、 +09:00 をスペースに変えてしまいます。


<!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

$rss = array("rss.xml","rss2.xml","rss3.xml","rss4.xml","rss5.xml");

foreach($rss as $value){

require_once("XML/Unserializer.php");
$xml_data = file_get_contents($value);
$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;

}

}

rsort($dat);


foreach($dat as $va){

$va = str_replace("+09:00"," ",$va);
$va = str_replace("T"," ",$va);

$temp .= $va;

}

echo $temp;



?>

</body>
</html>



配列$datの中身があるかぎり、中身の文字列の"+09:00"" "(空白)に置き換えて、さらに"T"" "(空白)に置き換えます。

そして、$tempという変数に、置き換えたものを入れ込みます。
この時、.=(ドットイコール)というものを使っていますが、これは「文字列の最後に付け加えて入れ込む」という意味です。

配列の中身がトリミングされ、どんどん付け加えられてひとつの文字列になっていきます

最後に変数$tempを表示します。→ 実行結果


一応これでも目的の機能を果たすRSSリーダーになってはいるのですが、念のためキャッシュを使用したいと思います。


いよいよ次回、初心者のための「PHPの配列」入門、最終回。
全米が泣く!?


clip!PHP 

この記事へのコメント
赤いpost
読んでます。

実行するのに時間がなくてごめんなさい。

afiliate
どおも〜赤いpostさま。

あ、読んでくれている方がいらっしゃった。嬉しいです〜。
暇な時にでもやってみて下さい。

動かしながら記事を書きましたが、どこかで間違えたりしてるかもしれません。うごかない時はコメントくださいませ〜。