条件にあったデータから引用して 2つ 表示させる方法 - PHPプロ!Q&A掲示板

230

  • 1000P

条件にあったデータから引用して 2つ 表示させる方法

質問日時 / 2006年11月9日 16:23    回答数 / 4件

Questioner:  yumisaiki  このエントリーをはてなブックマークに追加 

http://mawashimono.com/web/dlcgi/nik.html
の日記ソフトでできたデータを再利用して表示させるプログラムを見よう見真似で書きました。
/niklog/ というフォルダの中に 0611 などといった 年月の名前になったデータがあり、そこに 

200611100000 2006年11月10日0時0分 タイトル 内容 画像

といった順番にデータが入っています。 これを吸い込んで、今日と同じものがあったら今日のデータを表示させ、今日の予定がなかったら次の条件を表示させるという単純なものです。

WHILE(TRUE)をつかえば、すべて 表示してしまいますので、2つとか3つとか表示させるにはどうしたらいいですか?

簡単な方法はないでしょうか?

実働しているのは、http://www.yuu-yu.com/ にありますが、今後2つとか3つとか表示させられたら便利なのにと思いました。

<?

$logdir  = "./niklog/"; //データフォルダのパスを指定
$year    = date("y"); //年
$month   = date("m"); //月
$day     = date("j"); //日
$logpath = $logdir.$year.$month; //上のふたつを直結してログファイルのパス作成
$day1 = $year.$month;
$target = "<a target=_blank href=\"http://www.yuu-yu.com/nik/nik.cgi?log=" ;

//確認用
//print($logdir."<br>".$date."<br>".$logpath."<br>".$today."<br>");
//print($day2);
//===============================================
//■表示処理
//===============================================

//ファイルが存在する場合
if (file_exists($logpath))
 {
$lines = @file($logpath); //ファイルの中身を読み込み、配列として$linesに代入

//配列の行の中身を順々にチェックし、予定が今日以降の日付である場合表示する
foreach($lines as $value)  //$valueに各行の内容が入る
 {
$line = explode(" ", $value); //スペース区切りで配列として$lineに代入

//今日の予定がある場合
if ($date == $line[0])
 {
print($target.$day1."&idc=".$line[0]."\">".$line[1]."<br>".$line[2]."</a>");
print("本日の予定です!");
}

 if ($date < $line[0]) 
{

print($target.$day1."&idc=".$line[0]."\">".$line[1]."<br>".$line[2]."</a>");
print("<br>");

break; //ループから外れる

 }
 }
?>


その他、このプログラムの改善点などありましたら教えてもらいたいです。
よろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01wintermute・ループの前でカウンタを初期化する。 ($counter =
┃┗A01-1yumisaiki考え方はわかりましたが、どこに入れたらいいのかちょ
┗A02edute冒頭に以下を仮に追加しまして $view_max = 2; //表
 ┗A02-1yumisaiki確かに 以下のように書くと2つ表示となりました!!

回答一覧

並び替え:

A01
answererwintermute [11月9日 16:39]

・ループの前でカウンタを初期化する。
($counter = 0)
・表示したら、カウンタをインクリメントする。
($counter++)
・ループの最後の行で、カウンタが指定の行数に達していたらブレイクする。
(if ($counter >= 2) break;)

この意見に回答する

ツリーへ TOPへ

A01-1
replyeryumisaiki [11月9日 17:45]

考え方はわかりましたが、どこに入れたらいいのかちょっとわかりませんでした。
ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A02 満足
answereredute [11月9日 17:14]

冒頭に以下を仮に追加しまして
$view_max = 2; //表示する上限件数
$view_count = 0; //表示した件数
 
本日の日付、もしくはそれ以降の日付で内容をprintしたら、直後に
$view_count++;
if ($view_count >= $view_max) {
 break;
}
とか
if (++$view_count >= $view_max) {
 break;
}
などでも

yumisaikiさんが示されたコードですと、breakが必ず(未来の日付の)1件目で実行されてしまうので
カウンタを持たせて一定数を越えていたらbreakし、超えてない場合はそのままループして、
printが実行されるようにする、と考えればいいと思います。

この意見に回答する

ツリーへ TOPへ

A02-1
replyeryumisaiki [11月9日 17:44]

確かに 以下のように書くと2つ表示となりました!!

 //===============================================
//■表示処理
 //===============================================

//ファイルが存在する場合
if (file_exists($logpath))
 {
$lines = @file($logpath); //ファイルの中身を読み込み、配列として$linesに代入

//配列の行の中身を順々にチェックし、予定が今日以降の日付である場合表示する
foreach($lines as $value)  //$valueに各行の内容が入る
 {
$line = explode(" ", $value); //スペース区切りで配列として$lineに代入

//今日の予定がある場合
if ($date == $line[0])


 {

print($target.$day1."&idc=".$line[0]."\">".$line[1]."<br>".$line[2]."</a>");
print("本日の予定です!");
$view_count++;




if ($date < $line[0]) 
 {

     print($target.$day1."&idc=".$line[0]."\">".$line[1]."<br>".$line[2]."</a>");
print("<br>");
$view_count++;



            
         if ($view_count >= $view_max)
        {
                         break;
                } 

 }

_____________________

ありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)