人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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件程度の上限を設けても構いません。
どのように書くと良いでしょうか。

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

●質問者: oenoy
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:echo PHP RSS URL UTF-8
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● bayan
●27ポイント

見たところ $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; 
}
◎質問者からの返答

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


2 ● bayan
●27ポイント

あー、すみません。

うっかり 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

◎質問者からの返答

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


3 ● tobeoscontinue
●26ポイント

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

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を使うように心がけたほうがいいように思います。

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ