PHPの配列で遊んでみる ITかあさん

ITかあさん

PHPの配列で遊んでみる


RSSをもっと見やすく表示したい!

前回の記事でRSSをsimplexml_load_string関数を使ってRSSのXMLを表示してみました。でも、ちょっと見にくいし、分かりずらいので、自由に自分のほしいデータを持ってこれるように 配列構造を変更して、より配列に慣れ親しんでいこうと思います。
配列が分かればPHPが分かります。
ずばり、

配列を制するものは配列を制す!

です。

RSSを通常の配列の形に

前回の記事の最後の方にちょっとxmlオブジェクトのままだと扱いにくい点に触れましたが、
それならば扱いやすい配列の形に変換すればいいんです。
最初の2つのxmlオブジェクトとして展開するまでは前回と何も変わっていまん。
少し変わったのが、そのまま$xml->channel->item->$i->title;をechoで出力せず、
一度$rss[$i][‘title’]に代入してあげている点です。

連想配列に変換

実際に連想配列にする処理は以下。とってもシンプルですね。

//フィードを取得したいRSSのURLを記述
$contents = file_get_contents('http://www.kaasan.info/feed');
//XMLをオブジェクトに変換
$xml = simplexml_load_string($contents);
//連想配列作成用に、新規で空の配列を用意する
$rss = array();
for ($i = 0; $i <= 9; $i++) {
$rss[$i]['title'] = (string)$xml->channel->item->$i->title;
$rss[$i]['description'] = (string)$xml->channel->item->$i->description;
$rss[$i]['date'] = (string)$xml->channel->item->$i->pubDate;
$rss[$i]['link'] = (string)$xml->channel->item->$i->link;
}

解説

for文のループについては前回の記事を参考にしてもらうとして、大事なのが2つ。

・新規に配列を作る時は空の配列を用意する
・代入するxmlオブジェクトを(string) string(文字列)指定にする

まず配列とは、タンスのイメージです。
引き出しの中にデータが入ります。
ただの変数では引き出しがありません。
引き出しが無いなら空の配列を代入することで新たに引き出しを作ってあげればいいんですね。
たったコレだけ空の配列が出来、配列として代入することが出来るのです。
新たに配列を作りたいときには有効ですのでぜひ覚えて下さい。
RSSの配列代入イメージ

作った配列を出力してみる

作った配列をprint_rして出力してみましょう。
実行例
RSSをそのまま出力したものと比べるとぐっと見やすくなったのが分かりますか?
RSSをそのまま出力
$rssの出力
今まではrssの情報をすべて出力していましたが、今回新規で作った配列$rssは必要な部分だけ選んで配列化していますから、
とても見やすいですね。

RSSをHTMLの中に出力

最後の仕上げです。作った$rssをHTMLの中に書いて、きれいにRSSを表示してみましょう!
今回は非常に簡単だったのでループをもう一つ新しいものを覚えておきましょう。
foreach文です。

foreach文

for文は

for ($i = 0; $i <= 9; $i++){
echo ‘hogehoge';
}

としたように、$iがいくつから始まり,いくつまで繰り返すかを必ず指定しなければなりませんでしたが、
foreachはfor文と違い、問答無用で配列のある文だけループします。
たったこれだけです。初心者にはfor文が直感的で分かりやすいという意見もありますが、
PHPではforeachの方がやや実行が早いというメリットもありますので
for文の特性を利用した『配列中の何番目から何番目!』という決まりが無く、配列全て出力するのであればforeachを使うのがよいでしょう。

foreach($rss as $val)となっていたら、$valにデータを代入しているようなイメージでいてください。

foreachでの実行例

<dl>
<?php foreach($rss as $val):?>
<dt>
<a href="<?php echo $val['title'];?>">
タイトル:<?php echo $val['title'];?></a>
</dt>
<dd>ディスクリプション:<?php echo $val['description'];?></dd>
<dd>日付:<?php echo $val['date'];?></dd>
<?php endforeach;?>
</dl>

またはこんな書き方も出来ます。

<dl>
<?php foreach($rss as $val){ ?>

<dt><a href="<?php echo $val['title'];?>">タイトル:<?php echo $val['title'];?></a></dt>
<dd>ディスクリプション:<?php echo $val['description'];?></dd>
<dd>日付:<?php echo $val['date'];?></dd>
<?php } ?>
</dl>

ただ、これでは実際に } 閉じるタグがfor文の閉じタグなのかforeachの閉じタグなのかどちらなのか分からりにくいので個人的には上の方をオススメします。

これは何回目のループなのかを出したいなら

これは何回目のループなのかを出力したいなら、キー名の出力の仕方を覚えるとよいです。

<dl>
<?php foreach($rss as $key => $val):?>
<dt>第<?php echo $key;?>回目</dt>
<dt><a href="<?php echo $val['title'];?>">タイトル:<?php echo $val['title'];?></a></dt>
<dd>ディスクリプション:<?php echo $val['description'];?></dd>
<dd>日付:<?php echo $val['date'];?></dd>
<?php endforeach;?>
</dl>

実行例
以上でRSSの出力についてはおしまいです!