複数のRSSを統合して更新日時でソートする方法[PHP]

ブログポータルサイトのように、複数のRSSを統合して記事を更新日時順でソートして表示させる方法というのを、PHPを使ってやってみました。

ほとんどのコードは以下の記事を参考にさせていただきました。
複数のRSSを統合し最新情報を取得する-thrive on lab

RSSパーサーには有名なMagpieRSSというのを使います。

ソースコードは以下です。

――――――――――――――――――――――――――――――――――
<?php
require_once('./includes/magpierss/rss_fetch.inc');  //MagpieRSSロード
define('MAGPIE_OUTPUT_ENCODING','UTF-8');

//読み込むRSSを配列に格納
$rssUrl=array(
"http://feeds.feedburner.com/Dezimocom",
"http://b.hatena.ne.jp/entrylist?sort=hot&threshold=&mode=rss",
"http://feeds.newsing.jp/rss/newsing/rss"
);

//表示する記事の件数
$num=20;
$HTMLbody ="";

if($datacount !== 0){

foreach ($rssUrl as $no => $rss_url) {
 if ($rss_url != '') {
  //URLからRSSを取得
  $rss   = @fetch_rss($rss_url);
  if ($rss != NULL) {
   for ($i=0; $i<count($rss->items); $i++) {
    //サイトのタイトルをitemsに格納
    $rss->items[$i]["site_title"] = $rss->channel["title"];
    $rss->items[$i]["site_link"] = $rss->channel["link"];
   }
   //itemsだけ別配列に格納
   $rssItemsArray[] = $rss->items;
  }
 }
}

$concatArray = array();
if (is_array($rssItemsArray)) {
 for($i=0;$i<count($rssItemsArray);$i++){
  //配列を統合する
  $concatArray = array_merge($concatArray,$rssItemsArray[$i]);
 }

 foreach ($concatArray as $no => $values) {

 //「RSS広告は除外する」
  if(preg_match("/PR:/", $values["title"])){
   }else{
//RSSの種類によって日付を取得
                if($values['published']){$date = $values['published'];}
                elseif($values['created']){$date = $values['created'];}
                elseif($values['pubdate']){$date = $values['pubdate'];}
                elseif($values['dc']['date']){$date = $values['dc']['date'];
             }
  $date=date("Y-m-d",strtotime($date));
  $title=$values["title"];
  $link=$values["link"];
  $site_title=$values["site_title"];
  $site_link=$values["site_link"];
  //記事ごとに必要な項目を抽出
  $rssArray[]=array($date, $title, $link, $site_title, $site_link);
 }
}

//配列をユーザー定義関数でソート
 if ($rssArray) { usort($rssArray, 'cmp'); }
 if (count($rssArray) > $num) {
  $count=$num;
 } else {
  $count=count($rssArray);
 }

//必要な件数分だけHTML整形
 for ($i=0; $i<$count; $i++) {
  $date=date("Y年m月d日",strtotime($rssArray[$i][0]));
  $title=$rssArray[$i][1];
  $link=$rssArray[$i][2];
  $site_title=$rssArray[$i][3];
  $site_link=$rssArray[$i][4];
  $HTMLbody .="<ul>";
  $HTMLbody .="<li><div class=\"blog_date\">[".$date."]</div><div class=\"blog_con\"><span class=\"entry_title\"><a href=\"".$link."\" target=\"_blank\">".$title."</a></span><br /><span class=\"blog_title\"><a href=\"".$site_link."\" target=\"_blank\">".$site_title."</a></span></div></li>";
  $HTMLbody .="</ul>";
  }
 }
}else{
$HTMLbody .="まだ記事がありません。";
}

//=======================================================
// 多次元配列ソート用比較関数
// この場合は配列の1番目の項目を降順にソート
//=======================================================
 function cmp($a, $b) {
  if ($a[0] == $b[0]) return 0;
  return ($a[0] > $b[0]) ? -1 : 1;
 }
?>
<?=$HTMLbody ?>
――――――――――――――――――――――――――――――――――

以上です。
MagpieRSSはRSSの取得はもちろんのこと、キャッシュを作成してくれるので非常に便利です。
(といってもやはり表示には多少時間がかかりますが…)

日付の取得方法の部分ですが、
――――――――――――――――――――――――――――――――――
if($values['published']){$date = $values['published'];}
elseif($values['created']){$date = $values['created'];}
elseif($values['pubdate']){$date = $values['pubdate'];}
elseif($values['dc']['date']){$date = $values['dc']['date'];
――――――――――――――――――――――――――――――――――
この部分で、ATOM、RSS1.0、RSS2.0などの異なるRSSフォーマットから日付を取得しています。
それを、
――――――――――――――――――――――――――――――――――
$date=date("Y-m-d",strtotime($date));
――――――――――――――――――――――――――――――――――
この部分で同じ日付フォーマットにした後に、それを順番にソートしています。

あと、
――――――――――――――――――――――――――――――――――
  if(preg_match("/PR:/", $values["title"])){
――――――――――――――――――――――――――――――――――
この部分はアメブロなどはRSSの中に広告が入ってくるのですが、「PR:」が記事タイトルに入っている場合にその記事を飛ばして表示するようにしました。

これでちょっとしたRSSリーダーのような物ができちゃいます。

例えばDBに登録してあるRSSのURLを配列に格納したい場合は、
――――――――――――――――――――――――――――――――――
$result = 'SELECT rssurl FROM a_table ';
$result = mysql_query($result);
while($row = mysql_fetch_array($result)){
$rssUrl[] .= $row['rssurl'];
}
――――――――――――――――――――――――――――――――――
といった形でできます。
 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です