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

php の質問です。以下は 20091020 のような日付を数値化した名前のフォルダが複数あり、別のリスト(タブ区切りのテキストファイル)と照合して、マッチすると日付に対応した文字列をひろってそれを表示する、という内容のつもりなのですが、一度マッチすると、更新されず、全ての文字列($photo_title の部分)が同じになってしまいます。どこが間違っているのか教えていただけませんでしょうか。

$photo_date_ary = array("20090801","20090915","20091010");
$open = fopen('event_info.dat','r');
for($i = 0; $i < count($photo_date_ary); $i++){
while(($line = fgets($open)) != false){
$event_info = explode("\t",$line);
$event_date = $event_info[0];
if($photo_date_ary[$i] == $event_date){
$photo_title = $event_data[1];
break;
}
}
$line .= $photo_date_ary[$i].'*'.$photo_title.'<br />';
}
print($line);

表示期待例:
20090801*夏祭り
20090915*お月見
20091010*運動会

現状:
20090801*夏祭り
20090915*夏祭り
20091010*夏祭り

event_info.dat 中身
20091010(タブ)運動会(改行)
20090915(タブ)お月見(改行)
20090801(タブ)夏祭り(改行)
(EOF)

●質問者: AKI-NAMI
●カテゴリ:ウェブ制作
✍キーワード:DAT open PHP print テキスト
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● tdoi
●100ポイント ベストアンサー

ループの順序がよろしくないです。fgetsのループは1度しか走査していません。

現状で出ている結果のうち、最初のものはマッチしたものですが、その後の2つは、マッチしてbreakで抜けたのではなく、while()の中を一度も通らずに出た後に表示されたものです。

直すのであれば、

for($i = 0; $i < count($photo_date_ary); $i++){
 $open = fopen('event_info.dat','r');
 $found = false;
 while(($line = fgets($open)) != false){
 if($photo_date_ary[$i] == $event_date){
 $photo_title = $event_data[1];
 $found = true;
 break;
 }
 }
 fclose($open);
 if ($found) {
 $line .= $photo_date_ary[$i].'*'.$photo_title.'<br />';
 }
 }

のようにするのが1つです。

何度もファイルオープンするところはこの順序でやるのであれば、工夫して欲しいとこですが。

あるいは逆にループを回して以下のような感じにするかです。

while(($line = fgets($open)) != false){
 $event_info = explode("\t",$line);
 $event_date = $event_info[0];
 for($i = 0; $i < count($photo_date_ary); $i++){
 if($photo_date_ary[$i] == $event_date){
 $photo_title = $event_data[1];
 $line .= $photo_date_ary[$i].'*'.$photo_title.'<br />';
 break;
 }
 }
 }

どちらがいいかはデータ量などによるので、一概には言えませんが。

何かの参考になれば。


http://dummy

◎質問者からの返答

私の説明が足りなかったようです。

event_info.dat には、例えば、

20090801001(タブ)夏祭り(タブ)コメントA(改行)

20090801002(タブ)夏祭り(タブ)コメントB(改行)

20090801003(タブ)夏祭り(タブ)コメントC(改行)

のように一対一ではありません。

もう少し説明すると、画像ファイル event_img があって、その下に $photo_date_ary の中身のようなナメのフォルダがあり、その 20090801 を タグ付で表示させて、日付に対応したギャラリーを表示させるというものですので、このままでは"見た目"、event_info.dat の内容を表示しただけになってしまいます。

while 以下の部分が一度しか通っていないことはわかっていたのですが、なぜ通らないのかが理解できていません。


2 ● taramonera
●0ポイント

ダミー

http://yahoo.co.jp


$photo_title = $event_data[1];

$photo_title = $event_info[1];

ではないでしょうか。

◎質問者からの返答

質問時の記入ミスです。

「どこが間違っているか」と言えば確かにそうなのですが・・・


3 ● きねーま
●50ポイント

http://kine.s333.xrea.com

URLはダミーです(一応自分のサイトではありますが)


既に他の方も回答しているようですが、なおしてみました。


$photo_date_ary= array("20090801","20090915","20091010");

$open = fopen('event_info.dat','r');

$line2="";

while(($line = fgets($open)) != false){

for($i = 0; $i < count($photo_date_ary); $i++){

$event_info = explode("\t",$line);

$event_date = $event_info[0];

if($photo_date_ary[$i] == $event_date){

$photo_title = $event_info[1];

$line2 .= $photo_date_ary[$i].'*'.$photo_title.'
';

break;

}

}

}

print($line2);

?>

ポイントは

・ファイルを読み出すWhile文はFor文の前

ですね。

◎質問者からの返答

上の方と同じですね。

ファイルを読み出す部分は回す前、と単純に覚えておけばいいでしょうか。

結果は回ったのですが、私の説明不足で回りすぎ?ています。

関連質問


●質問をもっと探す●



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