ブログのRSSを取得表示するphpを作成しています。

ソースは
http://otonantenna.sakura.ne.jp/rssreader4php/test.txt
実際の表示は
http://otonantenna.sakura.ne.jp/rssreader4php/index.php

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/01/05 00:53:26
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Cherenkov No.2

回答回数1504ベストアンサー獲得回数493

ポイント60pt

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

ヒアドキュメントの部分だけ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;
?>
id:numb08

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

2011/01/04 22:02:02

その他の回答1件)

id:Galapagos No.1

回答回数963ベストアンサー獲得回数89

ポイント17pt

まず確認ですが、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;
?>
id:numb08

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

2011/01/04 21:59:59
id:Cherenkov No.2

回答回数1504ベストアンサー獲得回数493ここでベストアンサー

ポイント60pt

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

ヒアドキュメントの部分だけ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;
?>
id:numb08

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

2011/01/04 22:02:02
  • id:Cherenkov
    >indexリンク
    とはどういうものですか?
  • id:numb08
    わかりづらくてすいません。そのサイトのTOPページのURLのことです。
  • id:Cherenkov
    ああ、もしかして、エントリーのURLの後ろを切ってトップページにリンクするような感じですねかね。
    フィードのURLを追加する部分に、エントリーURLとトップページURLをペアで記述するようにすればいいかな。ちょっとやってみます。
  • id:Cherenkov
    RSSの項目に一応トップページと見てもよさそうなものがあったのでそれを使うようにしました。

    foreach ($rss -> items as $item) { の下に、
    $site_index_url = $rss -> channel["link"];
    を追加。
    さらにその下にある$linkを以下のように書き換えてみてください。
    $link = '<a href="' . $item["link"] . '" target="_blank">' . $entry_title . '</a> / <a href="' . $site_index_url . '" target="_blank">' . $site_title .'</a>';
  • id:numb08
    完璧でした。ご丁寧にどうもありがとうございました。おかげさまで思ったとおりのphpができました。また機会があればよろしくお願いします。
  • id:Cherenkov
    よかったです。
    $link = "<a href='{$item["link"]}' target='_blank'>$entry_title</a> / <a href='$site_index_url' target='_blank'>$site_title</a>";
    二重引用符と中括弧を使えばきれいに書けました。
  • id:Galapagos
    1で回答した者です。

    >RSSが1つのサイトしか表示されなかったです

    ご利用状況に合わせて配列 $urls の内容を書き換えましたか?
  • id:numb08
    すべてコピペしたうえでRSSのURLは書き換えました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません