PHP初心者です。

Magpie RSS - PHP RSS Parser を使って、
http://www.hyuki.com/yukiwiki/wiki.cgi?MagpieRSS

はてなフォトライフRSSの記事(アイテム)をfor文で5件取得しています。
http://www.hatena.ne.jp/info/xmlns

<?php
require_once 'rss_fetch.inc';
$url = 'http://f.hatena.ne.jp/t/%E7%A9%BA%E6%A8%A1%E6%A7%98?mode=rss';
$rss = fetch_rss($url);

for( $i=0; $i<4; $i++){
$item = $rss->items[$i];
$title = $item[title];
$title = mb_convert_encoding($title, "utf-8", "auto");
echo $title;
}
?>


これをRSSにある記事総数から、ランダムで5件取得したいと思っています。
総数でなく30件程度の上限を設けても構いません。
どのように書くと良いでしょうか。

教えてください。よろしくお願いいたします。

回答の条件
  • 1人10回まで
  • 登録:2008/01/03 22:12:37
  • 終了:2008/01/10 22:15:03

回答(3件)

id:bayan No.1

bayan回答回数100ベストアンサー獲得回数132008/01/03 23:15:31

ポイント27pt

見たところ $rss->items は配列のようですね。

配列の順番をランダムにする shuffle という関数があります。

動作は未確認なのですが、次のようにするとどうでしょうか。

$rss = fetch_rss($url);
$items = $rss->items;
for( $i=0; $i<4; $i++){
  $item  = $items[$i];
  $title = $item['title'];
  $title = mb_convert_encoding($title, "utf-8", "auto");
  echo $title; 
}
id:oenoy

ありがとうございます。shuffle を使うのですね。shuffle を含めたソースを再度頂けると助かります。

2008/01/03 23:45:49
id:bayan No.2

bayan回答回数100ベストアンサー獲得回数132008/01/03 23:58:06

ポイント27pt

あー、すみません。

うっかり shuffle が落ちていました。

再度回答します。

$rss = fetch_rss($url);
$items = $rss->items;
shuffle($items); // ここで使ってます
for( $i=0; $i<4; $i++){
  $item  = $items[$i];
  $title = $item[title];
  $title = mb_convert_encoding($title, "utf-8", "auto");
  echo $title; 
}

マニュアルはこちら。

http://www.php.net/manual/ja/function.shuffle.php

id:oenoy

できました!ありがとうございます。一日探していたので助かりました。

2008/01/04 00:03:17
id:tobeoscontinue No.3

tobeoscontinue回答回数214ベストアンサー獲得回数542008/01/04 00:48:19

ポイント26pt

既に解決済のようですが、またも関数にしてみました。

define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
require_once 'magpierss/rss_fetch.inc';

magpierssの最新版(ver0.7)だと、文字化けが起こっているようですので

defineを追加しています。0.7でなければ必要ないかもしれません。

function array_rand_clone($datas, $count = 1)
{
 if (count($datas) < $count) $count = count($datas);
 $keys = array_rand($datas, $count);
 $clone = array();
 foreach ($keys as $key ) {
   $clone[] = $datas[$key];
 }
 return $clone;
}

array_randという関数があるのですが、これはランダムな添字を返すだけなので、値そのものを返す関数にしてみました。array_randは必要な個数を指定できるのですが配列の大きさよりも大きい値を指定するとエラーになるのでifで範囲を越えないようにしています。

function array_hatena_items($url, $count = 5)
{
 $rss = fetch_rss($url);
 return array_rand_clone($rss->items, $count);
}

$urlで指定のrssをパースして$rss->itemsをarray_rand_clone()で$countで指定された分を取り出し返します。

$items = array_hatena_items('http://f.hatena.ne.jp/t/%E7%A9%BA%E6%A8%A1%E6%A7%98?mode=rss');
foreach ($items as $item)
 echo $item['title'].'<br>';

array_hatena_items()で5個取り出します(ディフォルトで5としているので)

30個ならarray_hatena_items('http://f.hatena.ne.jp/t/%E7%A9%BA%E6%A8%A1%E6%A7%98?mode=rss',30)とします。

rssのディフォルトencodingはutf-8です。はてなもそうなっていますので出力がutf-8ならmb_convert_encodingする必要はありません。

for( $i=0; $i<4; $i++){
$item = $rss->items[$i];
}

配列をforで処理する場合は常に添字の範囲($i<4の部分の4)に注意しなければなりません。

とかくエラーになりやすいので配列を処理する場合はforeachを使うように心がけたほうがいいように思います。

id:oenoy

大変勉強になります!ありがとうございます!

2008/01/04 01:52:28

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

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

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

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

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