■What's
さて、いい加減に表示順を最新が上に来るようにしたいと思います。ついでにログの表示件数も設定しちゃいましょう。コレはループでちょっといじればできちゃいます。では、いきましょう!
■サンプルプログラム
テキストエディタに以下のように書き込んで、「lesson10」フォルダの中に「form3.php」として保存しましょう。
<?php
$log = 10;
$body = $_REQUEST["body"];
if($_REQUEST["write"] != ""){
if($body != ""){
$body = $body."\n";
$fp = fopen("./data.txt","a");
fputs($fp,$body);
fclose($fp);
}else{$error_message = "<font color=\"#FF0000\"><b>何も入力されていません</b></font>";}
}
?>
<html>
<head>
<title>一行掲示板</title>
</head>
<body>
<h1>一行掲示板</h1>
書き込む内容を入力してください。(現在<b><?= $log ;?></b>行で表示中!)<hr>
<?= $error_message; ?>
<form name="form" action="<?php print $_SERVER['PHP_SELF']; ?>" method="POST">
<input name="body" type="text" size="40">
<input name="write" type="submit" value="書込"><hr>
<?php
$data = file("./data.txt");
for($i=sizeof($data)-1; ($i>=0) && $i>=(sizeof($data)-$log); $i--){
print "記事NO.${i}:${data[$i]}<br>\n<hr>";
}
?>
</form>
</body>
</html>
できましたら、ブラウザのアドレスに
「http://localhost/lesson10/form3.php」と入力してアクセス!!
ロリポップ!
さくらのレンタルサーバ
などのレンタルサーバー使ってる方はlocalhostのところはドメイン名になります。
(簡単に安くネットショップを開きたい方はこちら!)
さて、如何でしょうか?ちゃんと表示されましたでしょうか?
■解説
$log = 10;
まずは、ココ!表示する件数を$logに代入しています。お好きなログ表示件数を代入してください。
for($i=sizeof($data)-1; ($i>=0) && $i>=(sizeof($data)-$log); $i--)
今回、いじったのはココですね。ぱっと見よくわかんないですよね^^; 私も全然わかりませんでした。なので、私なりの説明を。
$i=sizeof($data)-1
forループの初期値のところですが、sizeof()関数を使って、$data配列の要素数をカウントしています。つまり要素数(書き込みの数)が15あったとします。となると、「$i=sizeof(15-1)」となります。なぜ-1なのか?テキストエディタでもいいので15行書いてみるとわかりやすいかもしれません。$dataで一行目を表示するには、「$data[0]」ですよね?そうなんです!ゼロから始まるのです!ですから、
1行目→$data[0]
2行目→$data[1]
3行目→$data[2]
4行目→$data[3]
5行目→$data[4]
15行目→$data[14]
となるわけです。$iの初期値には「$i=15-1=14」が代入されるわけですね。
($i>=0) && $i>=(sizeof($data)-$log)
さて、次に評価ですが、「$i>=0」となっているのは「$iは0以上」ということです。$iはゼロが含むというのがミソです。そして、&&を使って「$i>=sizeof($data)-$log」となっています。これは、表示する件数を設定しています。「($iが$data配列の要素数) - (表示ログ数より大きければ)」ということになります。まとめると、
「$iは0以上、かつ、$iは書き込み件数-ログ表示件数」
ということになります。これがtrueの間ループを処理していくわけです。そして反復子では、「$i--」として$iから1ずつ引いていきます。ちょっとややこしくなってきましたね^^; ちょっと例を挙げながら追っていきます。以下の書き込みがあったとします。15は行番号です。
[$data配列]
15 明日から出張ナンデスヨ。