PHPのsimplexmlで複数のxmlを読み込む方法を教えて下さい。

http://q.hatena.ne.jp/1287372348を参考にして、一つはrssを表示できました。
複数表示させる場合はどうすればいいでしょうか。arrayなど試して見ましたが、なかなかうまく行きません。
よろしければコードを書いていただければ幸いです。よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/11/01 19:48:36
  • 終了:2011/11/08 19:50:04

ベストアンサー

id:rouge_2008 No.1

rouge_2008回答回数594ベストアンサー獲得回数3512011/11/07 11:46:32

複数のRSSを混在させて1箇所に表示させたいのでしょうか?

参考質問の回答を以下のように変更する事で複数のRSSを新着順に表示しますが、タイムゾーンの違いによる時差までは考慮していませんので、気になるようでしたら修正して使用してください。

日本のサイトが配信しているRSSでしたら、ほとんどは同じタイムゾーンを使用しているのではないかと思いますが・・・

一応、RSSバージョン1.0と2.0に対応させてあります。


オブジェクトを配列に変換する関数は、http://soft.fpso.jp/develop/php/entry_2764.htmlを使用させていただいています。

$nums = 10; // 1ページの表示件数
$rsslist = array('http://~', // RSSのURLを配列にして代入します。
			 'http://~', // 2件で大丈夫な場合はこの行を削除します。(※行を追加して4件以上にしても大丈夫です。)
			 'http://~');

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]);

		if(isset($rssarr[$n]['channel']['item'])) {
			$allrss = array_merge($allrss, $rssarr[$n]['channel']['item']);
		} else {
			$allrss = array_merge($allrss, $rssarr[$n]['item']);
		}
	}

	usort($allrss, 'cmp');
	$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'];
}

# オブジェクト→配列変換用関数(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>&nbsp|';
// 各ページへのリンクを表示する場合
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 '>' . $item['title'] . ' (' . $date .')</a></li>';
        	echo "\n";
    	}
    	$count++;
}

echo "</ul>\n";
echo '<div style="margin: 15px 10px;">' . $link . "</div>\n";


設定項目は、「$nums(1ページの表示件数)」と「$rsslist(取得するRSSのURL)」の2つだけです。

id:goodpy1012

わざわざコードを書いていただきありがとうございます。

無事出来ました。本当にありがとうございました。

2011/11/08 22:39:47

コメントはまだありません

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません