ソースは
http://otonantenna.sakura.ne.jp/rssreader4php/test.txt
実際の表示は
http://otonantenna.sakura.ne.jp/rssreader4php/index.php
上記のように日付ごとに分け記事タイトルを表示しています。ここから1つのサイトではなく、「複数のサイトのRSSを取得」さらにそれを日付ごと最新順に並べ、記事タイトルの左に更新時間"15:30のような感じで"、記事タイトルの右にブログタイトル(リンク付き)を表示させたいです。いろいろ調べて自分でやってみたのですが、まったくできませんでした。どうぞご指南よろしくお願いします。
元コードをかみ砕いて分かりやすいようにしたつもりです。
ヒアドキュメントの部分だけ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; ?>
まず確認ですが、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つのサイトしか表示されなかったです。でもとても参考になりました。
元コードをかみ砕いて分かりやすいようにしたつもりです。
ヒアドキュメントの部分だけ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リンクにするのはどうすればいいのでしょうか?
ご回答ありがとうございました。思っていた感じにできました。あとすいません、もう1つお願いしたいのですが、ブログタイトルのリンクを記事リンクではなくindexリンクにするのはどうすればいいのでしょうか?