人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

ブログのRSSを取得表示するphpを作成しています。
ソースは
http://otonantenna.sakura.ne.jp/rssreader4php/test.txt
実際の表示は
http://otonantenna.sakura.ne.jp/rssreader4php/index.php

上記のように日付ごとに分け記事タイトルを表示しています。ここから1つのサイトではなく、「複数のサイトのRSSを取得」さらにそれを日付ごと最新順に並べ、記事タイトルの左に更新時間"15:30のような感じで"、記事タイトルの右にブログタイトル(リンク付き)を表示させたいです。いろいろ調べて自分でやってみたのですが、まったくできませんでした。どうぞご指南よろしくお願いします。


●質問者: numb08
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:PHP RSS サイト ソース タイトル
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Galapagos
●17ポイント

まず確認ですが、includeしているライブラリはMagpieRSSですよね。


以下のようにしてみて下さい。

なるべくオリジナルのコードは残したつもりです。エラー処理は行っていません。


<?php
require_once 'phplib/rss_fetch.inc';

//閲覧したいRSS(複数,配列で)
$urls = array(
 'http://jin115.com/index.rdf',
 'http://hoge1.com/hoge1.rdf',
 'http://hoge2.com/hoge2.rdf',
);

//複数のRSS($urls)を時間順に並び替えて配列($items)に格納
function sort_rss($urls, &$items) {
 $cnt = 0;
 foreach ($urls as $url) {
 $rss = fetch_rss($url);
 foreach ($rss->items as $item) {
 $items[$cnt]['title'] = mb_convert_encoding($item["title"], "UTF-8", "Auto");
 $items[$cnt]['link'] = $item['link'];
 $items[$cnt]['unix_time'] = strtotime(substr($item['dc']['date'], 0 ,10) . ' ' . substr($item['dc']['date'], 11 ,8));
 $cnt++;
 }
 }
}

//並べ替え関数
function my_sort($a, $b) {
 return $b['unix_time'] - $a['unix_time'];
}

//メインプログラム
$items = array();
sort_rss($urls, $items);
usort($items, my_sort);

$youbi = array(0 => '(Sun)', 1 => '(Mon)', 2 => '(Tue)', 3 => '(Wed)', 4 => '(Thurs)', 5 => '(Fri)', 6 => '(Sat)');
$oldday = 0;
$outstr = '';
$difftime = 24; //24時間以内に限定する
foreach ($items as $item) {
 if (time() - $item['unix_time'] < $difftime * 60 * 60) {
 $itemday = date("n/j", $item['unix_time']);
 $mday = date("w", $item['unix_time']);
 if ($oldday != $itemday)
 $outstr .= "<dt>{$itemday}{$youbi[$mday]}</dt>\n";
 $itemtime = date('H:i', $item['unix_time']);
 $outstr .= "<dd>({$itemtime}) <a href=\"{$item['link']}\">{$item['title']}</a></dd>\n";
 $oldday = $itemday;
 }
}

//表示
echo <<< EOT
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>RSS出力サンプル</title>
<body>
<dl>
{$outstr}
</dl>
</body>
</html>

EOT;
?>
◎質問者からの返答

回等ありがとうございました。RSSが1つのサイトしか表示されなかったです。でもとても参考になりました。


2 ● Cherenkov
●60ポイント ベストアンサー

元コードをかみ砕いて分かりやすいようにしたつもりです。

ヒアドキュメントの部分だけGalapagosさんのコードがきれいだったので参考にさせてもらいました。

<?php
require_once 'phplib/rss_fetch.inc';
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');

$urls = array('http://jin115.com/index.rdf',
 'http://headlines.yahoo.co.jp/rss/jct_dom.xml',
 'http://sankei.jp.msn.com/rss/news/points.xml',
 'http://headlines.yahoo.co.jp/rss/giz_ent.xml',
 'http://headlines.yahoo.co.jp/rss/itmedia_n.xml',
 'http://mainichi.pheedo.jp/f/mainichijp_flash');

//全てのエントリーを$entriesに入れる
foreach ($urls as $url) {
 $rss = fetch_rss($url);
 foreach ($rss -> items as $item) {
 $site_title = $rss -> channel["title"];
 $entry_title = $item["title"];
 $unix_time = ($item["date_timestamp"]) ? $item["date_timestamp"] : strtotime($item["dc"]["date"]);
 $itemday = date("n/j", $unix_time);
 $mday = date("w", $unix_time);
 $youbi = array(0 => '(Sun)', 1 => '(Mon)', 2 => '(Tue)', 3 => '(Wed)', 4 => '(Thurs)', 5 => '(Fri)', 6 => '(Sat)');
 $link = '<a href="' . $item["link"] . '" target="_blank">' . $entry_title . ' ' . $site_title .'</a>';
 $entries[$i++] = array("unix_time" => $unix_time, "day" => $itemday.$youbi[$mday], "link" => $link);
 }
}

// unix_timeを比較してソート
function cmp($a, $b) {
 if ($a["unix_time"] == $b["unix_time"]) {
 return 0;
 }
 return ((int)$a["unix_time"] < (int)$b["unix_time"]) ? 1 : -1;
}
usort($entries, "cmp");


$tmp = '';
$outstr = '';

foreach ($entries as $entry) {
 // 24時間以内か
 if((time() - $entry["unix_time"]) > 72*60*60) {
 continue;
 }
 // 日付を見ながら出力
 if ($entry["day"] != $tmp) {
 $tmp = $entry["day"];
 $outstr .= '<dt>' . $entry["day"] . '</dt><dd>' . date("G:i", $entry["unix_time"]) . ' ' . $entry["link"] . '</dd>';
 } else {
 $outstr .= '<dd>' . date("G:i", $entry["unix_time"]) . ' ' . $entry["link"] . '</dd>';
 }
}

echo <<< EOT
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
</head>
<body>
<dl>
{$outstr}
</dl>
</body>
</html>
EOT;
?>
◎質問者からの返答

ご回答ありがとうございました。思っていた感じにできました。あとすいません、もう1つお願いしたいのですが、ブログタイトルのリンクを記事リンクではなくindexリンクにするのはどうすればいいのでしょうか?

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ