Created
May 12, 2012 02:30
-
-
Save cherenkov/2663757 to your computer and use it in GitHub Desktop.
simplexmlで複数サイトのRSSを読みこみ、新着順で表示させる方法.. - 人力検索はてな http://q.hatena.ne.jp/1336407726
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
$nums = 10; // 1ページの表示件数 | |
$rsslist = array('http://michaelsan.livedoor.biz/index.rdf', // RSSのURLを配列にして代入します。 | |
'http://blog.livedoor.jp/domesaka/index.rdf', // 2件で大丈夫な場合はこの行を削除します。(※行を追加して4件以上にしても大丈夫です。) | |
'http://news4vip.livedoor.biz/index.rdf'); | |
//デバッグ時はコメントアウトにする。うまくいかなかったらcookieを消す。 | |
session_start(); // ページ遷移ごとにリクエストしないようにセッションを使用します。 | |
header('Content-Type:text/html; charset=UTF-8'); | |
if(!isset($_SESSION['rssses'])) { | |
foreach($rsslist as $url) { | |
$tmpData = file_get_contents($url); | |
$tmpData = str_replace('dc:creator', 'Creator', $tmpData); | |
$tmpData = str_replace('dc:date', 'Date', $tmpData); | |
$tmpData = str_replace('pubDate', 'Date', $tmpData); | |
$rssData[] = simplexml_load_string($tmpData); | |
} | |
foreach($rssData as $key => $value) { | |
if($value['version'] == '2.0') { | |
foreach($value->channel->item as $item) { | |
$date = date_create($item->Date); | |
$item->Date = date_format($date, 'Y-m-d\TH:i:sP'); | |
} | |
} | |
} | |
$i = count($rsslist); | |
$allrss = array(); | |
for($n=0;$n<$i;$n++) { | |
$rssarr[$n] = xml2arr($rssData[$n]); | |
//pr($rssarr[$n]); | |
$channelTitle = $rssarr[$n]['channel']['title']; | |
if(isset($rssarr[$n]['channel']['item'])) { | |
$rssarr[$n]['channel']['item'] = addChannelTitle($rssarr[$n]['channel']['item'], $channelTitle); | |
$allrss = array_merge($allrss, $rssarr[$n]['channel']['item']); | |
} else { | |
$rssarr[$n]['item'] = addChannelTitle($rssarr[$n]['item'], $channelTitle); | |
$allrss = array_merge($allrss, $rssarr[$n]['item']); | |
} | |
} | |
usort($allrss, 'cmp'); | |
//pr($allrss); | |
$i = count($allrss); | |
for($n=0;$n<$i;$n++) { | |
if(empty($allrss[$n]['title'])) { | |
$allrss[$n] = null; | |
} | |
} | |
$_SESSION['rssses'] = $allrss = array_filter($allrss); | |
} else { | |
$allrss = $_SESSION['rssses']; | |
} | |
function addChannelTitle($items, $channelTitle) { | |
$result = array(); | |
foreach($items as $item) { | |
$result[] = array_merge($item, array('channel_title'=>$channelTitle)); | |
} | |
return $result; | |
} | |
//dumpして確認する関数 | |
function pr($var) { | |
echo '<pre>'; print_r($var); echo '</pre>'; | |
} | |
# オブジェクト→配列変換用関数(http://soft.fpso.jp/develop/php/entry_2764.html) | |
function xml2arr($xmlobj) { | |
$arr = array(); | |
if (is_object($xmlobj)) { | |
$xmlobj = get_object_vars($xmlobj); | |
} else { | |
$xmlobj = $xmlobj; | |
} | |
foreach ($xmlobj as $key => $val) { | |
if (is_object($xmlobj[$key])) { | |
$arr[$key] = xml2arr($val); | |
} else if (is_array($val)) { | |
foreach($val as $k => $v) { | |
if (is_object($v) || is_array($v)) { | |
$arr[$key][$k] = xml2arr($v); | |
} else { | |
$arr[$key][$k] = $v; | |
} | |
} | |
} else { | |
$arr[$key] = $val; | |
} | |
} | |
return $arr; | |
} | |
function cmp($a, $b) | |
{ | |
return strcmp($b['Date'], $a['Date']); | |
} | |
$maxnum = count($allrss); // 最大件数を取得 | |
$pages = ceil($maxnum / $nums); // 最大ページ数を計算 | |
$page = (empty($_GET['page'])) ? 1 : $_GET['page']; // 現在のページを取得 | |
$start = ($page - 1) * $nums; // スタートページを設定 | |
$script = basename($_SERVER['SCRIPT_NAME']); | |
$link = ''; | |
// 前ページ・次ページのリンク設定※表示形式は自由に指定してください。 | |
if ($page > 1) $link = '<a href="'.$script.'?page='.($page -1) .'">PREV</a> |'; | |
// 各ページへのリンクを表示する場合 | |
for($n = 1; $n <= $pages; $n++) { | |
if($n == $page){ | |
$link .= '['.$n.']'; | |
} else { | |
$link .= '[<a href="'.$script.'?page='. $n .'">'.$n.'</a>]'; | |
} | |
} | |
if ($page < $pages) $link .= ' <a href="'.$script.'?page='.($page + 1) .'">NEXT</a>'; | |
echo '<div style="margin: 15px 10px;">' . $link . "</div>\n"; | |
echo "<h3>新着RSS</h3>\n<ul>\n"; | |
$count = 1; | |
foreach ($allrss as $rss => $item) { | |
if ($count > $start && $count <= $start + $nums) { | |
$date = preg_replace('/([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9:]{3}[0-9]{2})[0-9+:]+$/', '$1/$2/$3 $4', $item['Date']); | |
echo '<li class=""><a href="' . $item['link'] . '"'; | |
echo '>' . $date . ' ' . $item['title'] . ' ' . $item['channel_title'] .'</a></li>'; | |
echo "\n"; | |
} | |
$count++; | |
} | |
echo "</ul>\n"; | |
echo '<div style="margin: 15px 10px;">' . $link . "</div>\n"; | |
//pr($allrss); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment