簡単なお知らせを表示する(3)
簡単なお知らせを表示する(1)、簡単なお知らせを表示する(2)の続き。
今回は「記事の最大表示件数を指定する」っていう機能を加えたいのです。
考えたコト(第1段階)
- 最初に最大表示件数を変数に入れておく。
- 表示させる処理の部分の繰り返しの回数にそれを指定する。
素人発想で「あれ。これすぐにできるんじゃね?」と思った。これが大きな間違いだったと後で気づいた。とりあえず恥ずかしいけどやってみた工程、書いておきますね。
前回のに追加した部分・変更した部分
10件表示させることにして、普通に変数$data_maxに10を代入。
//データの最大表示件数
$data_max = 10;
まずは上の部分をソースの頭の方でいろいろ変数に入れてる並びに追加した。で、次に表示のための繰り返しの部分を少しだけ変更。
for($i = 0; $i < $data_max; $i++)
元々は「for($i = 0; $i < $news_num; $i++)」としてログ用ファイルに入ってる件数分繰り返し処理をしてた部分の「i < $news_num;」をさっき上で指定した最大表示件数の入った$data_maxを使って「i < $data_max;」に変更しただけ。今まで使ってたファイルでテストしてみるとバッチリ!なーんだ簡単じゃんとか思ったその時!
やっぱり落とし穴があったんだな
ふぅ。やっぱりな。簡単すぎると思ったぜ。ログ用のデータファイルを一度中身を全部消してみると・・・まず私の思惑ではこう。
<h1>1件目</h1>
<p>更新日時:○○</p>
<p>1件目内容</p>
この1件分だけが表示されると勝手に思い込んでた。ところが実際は
<h1>1件目</h1>
<p>更新日時:○○</p>
<p>1件目内容</p>
<h1></h1>
<p>更新日時:</p>
<p></p>
<h1></h1>
<p>更新日時:</p>
<p></p>
<h1></h1>
<p>更新日時:</p>
<p></p>
<h1></h1>
<p>更新日時:</p>
<p></p>
<h1></h1>
<p>更新日時:</p>
<p></p>
<h1></h1>
<p>更新日時:</p>
<p></p>
<h1></h1>
<p>更新日時:</p>
<p></p>
<h1></h1>
<p>更新日時:</p>
<p></p>
<h1></h1>
<p>更新日時:</p>
<p></p>
と、ログ用ファイルの中身に1件分しか入ってなかろうとも最大表示件数で指定した10件分までのhtmlソースが繰り返しされてた。
考えてみれば当然のことですよね。最大表示件数で指定した回数繰り返せって自分で命令してるんだもん。私バカ。プログラムって書いたとおりにしか動かないなって。自分だけで使うなら10件以上になった時点で上の指定入れれば何も問題ないかもしれないけど、いつかコレ実務で使ってやるぜと密かに目論んでるのでこれは何とかせねばいかん。
考えたコト(第2段階)
上のミスった件を踏まえて考え直す。問題は最大表示件数よりも少ない件数の時にどうするかっていう点。
- 最大表示件数よりもログが少なかった時の処理とそれ以上になった時の処理を分けて考える。
- 配列の要素の数は元々「$news_num = count($news_list);」という形で取得してたのでそれも利用する。
- 最大表示件数よりログが少ないか同じ時は$news_numまで繰り返す。
- 最大表示件数よりログが多い時は$data_maxまで繰り返す。
最初に思いついたのがこう。
//最大表示件数($data_max)よりも配列の要素が少ないか同じ場合
if($news_num <= $data_max){
for($i = 0; $i < $news_num; $i++){
list($subject2,$body2,$time2) = explode("\t",$news_list[$i]);
echo "<h1>$subject2</h1>\n";
echo "<p>更新日時:$time2</p>\n";
echo "<p>$body2</p>\n";
}
//最大表示件数($data_max)よりも配列の要素が多い場合
}else{
for($i = 0; $i < $data_max; $i++){
list($subject2,$body2,$time2) = explode("\t",$news_list[$i]);
echo "<h1>$subject2</h1>\n";
echo "<p>更新日時:$time2</p>\n";
echo "<p>$body2</p>\n";
}
}
表示は意図した結果にはなったけど、同じ処理内容が重複して出てくるからこれではダメだと思った。
考えたコト(第3段階)
「$i < $news_num;」「$i < $data_max;」の部分を振り分けられたら同じ処理内容が重複する事はなくなるので、そこをなんとかする。新しい変数を作って、それぞれの数を代入する。
//最大表示件数($data_max)よりも配列の要素が少ないか同じ場合
if($news_num <= $data_max){
$view_count = $news_num;
}else{
//最大表示件数($data_max)よりも配列の要素が多い場合
$view_count = $data_max;
}
//上で結合してたのをタブ区切りで分解して変数に値をセット
for($i = 0; $i < $view_count; $i++){
list($subject2,$body2,$time2) = explode("\t",$news_list[$i]);
echo "<h1>$subject2</h1>\n";
echo "<p>更新日時:$time2</p>\n";
echo "<p>$body2</p>\n";
}
$view_countの中身をログが最大表示件数より少ない時・同じ時と多い時によって値を変えて「$i < $view_count;」として繰り返しを行う。これでちょっとすっきり。その$view_countの値をifで振り分けてる部分、もう少しカッコいい書き方に変更してみる。
以前「三項演算子」っていうのをどっかで見た記憶があったので、その書き方にしてみる。マニュアル見るとこう書いてあった。
(expr1) ? (expr2) : (expr3) という式は、式1 が TRUE の場合に 式2 を、 式1 が FALSE の場合に 式3 を値とします。
(条件) ? A : B;
条件がTRUEだったらA、FALSEならBっていうことですよね。ならば、今回の場合はこうなるぞ、と。
$view_count = ($news_num <= $data_max) ? $news_num : $data_max;
短くスッキリ。いい感じ。
今回の最大表示件数に関する部分を追加したソース全文
前から気になってた憧れのコードハイライトを試してみたよ。使ってみたのはsyntaxhighlighterというやつ。変数の部分だけデフォのスタイルから色をピンクに変えてみた。関数の部分も変更しようと思ったんだけど、なんか一部の関数にclassがついてなくて中途半端になっちやったからそれはやめた。JS無効で閲覧してる人はいままで通りの見た目になってると思う。
横スクロールが出るくせにFx以外のブラウザで折り返ししてるな。なんでだ。まぁいっか。
いやーん。LDRでこの部分みたら当然ながら美しくなかったー><
preでマークアップするとname属性つけるとマズいと思ってtextareaで囲ったのがミスったなぁ。むぅ。
<< 簡単なお知らせを表示する(2) | 簡単なお知らせを表示する(3)補足 勉強メモ >>
トラックバック
このエントリーのトラックバックURL:
http://redline.hippy.jp/cgi/mt/mt-tb.cgi/208