- ベストアンサー
txtに入っているデータの全件テーブル表示をする場合
下記のdata.txt内のデータをphpでtable表示で全件を表示させたいのですが、最初の一件を表示することはできたのですが、あとのデータを同じように表示させる事を試みましたが、できませんでした。 一件目から縦に全件を表示させるにはどうしたらいいのでしょうか? よろしくお願いします。 data.txt------------ 12345,54321,田中,010,1234,5678,青森,2134,6854,山本,020,3210,5439,長崎,57404,74748,清水,030,5673,2865,岡山 ---------------------------------------------- <?php //ファイルオープン $fp = fopen('data.txt','r'); //データの読み込み $data=fgets($fp); //ファイルクローズ fclose($fp); //分割処理 $hairetu = split(',',$data); //出力処理 print("<table BORDER='1'>\n"); print("<tr><td>ID</td><td>パスワード</td><td>名前</td><td>TEL</td><td>住所</td></tr>\n"); print("<tr>\n"); print("<td>".$hairetu[0]."</td>\n"); print("<td>".$hairetu[1]."</td>\n"); print("<td>".$hairetu[2]."</td>\n"); print("<td>".$hairetu[3]."-".$hairetu[4]."-".$hairetu[5]."</td>\n"); print("<td>".$hairetu[6]."</td>\n"); print("<tr>\n"); print("</table>\n"); ?>
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、素朴な疑問ですが、data.txt においてですね 1件ごとに「改行」で区切るのが普通だと思うのですが つまり 12345,54321,田中,010,1234,5678,青森 2134,6854,山本,020,3210,5439,長崎 57404,74748,清水,030,5673,2865,岡山 のような感じということなんですが、何か理由があって 改行することなく、ずらずらとデータがコンマ区切りで 連なっているんですよね。 # 処理の効率からすると、1件=1行にした方が # よいと思うのですが・・・ > 最後の余白のところにきたら終了するという条件が考えられません。 「最後の余白のところにきたら終了する」→ 「配列の最後にきたら終了する」→ 「配列の最後にくるまで続ける」→ 「$i < count($hairetu)」 for($i = 0; $i < count($hairetu); $i += 7) { # 最後の余白っていうのが気になるんですが # 最後の「余白」ってなんでしょう? > 二件目になるとでません。 anmochi さんのプログラムでも出ないんですか? ほんとに、質問文のような data.txt の形式になっている んでしょうか? 1件のデータを改行で区切って、1行ずつ処理する方が 一般的な CSV 形式であって普通だと思いますが・・・ # う~ん、ファイルのロック問題があって、いっきに # fgets で全体を読み込もうとしてるのかな? 仮に data.txt が改行で区切られていると <?php // ファイルオープン $fp = fopen('data.txt','r'); print("<table BORDER='1'>\n"); print("<tr><td>ID</td><td>パスワード</td><td>名前</td><td>TEL</td><td>住所</td></tr>\n"); // ファイルの末端にくるまで続ける while(!feof($fp)){ // データの読み込み & 分割処理 $hairetu = split(',', fgets($fp)); // 出力処理 print("<tr>\n"); print("<td>".$hairetu[0]."</td>\n"); print("<td>".$hairetu[1]."</td>\n"); print("<td>".$hairetu[2]."</td>\n"); print("<td>".$hairetu[3]."-".$hairetu[4]."-".$hairetu[5]."</td>\n"); print("<td>".$hairetu[6]."</td>\n"); print("<tr>\n"); } print("</table>\n"); fclose($fp); ?> というプログラムになります。(参考に)
その他の回答 (2)
- tripod_r
- ベストアンサー率38% (5/13)
No2の方が言うように改行(\n等)で区切らなければ後々しんどいです。 私の場合テーブル等に使用するデータはCSV形式(,区切り)で作成しています。 まず、データのフォーマットを決めます。 例) ID,PASSEORD,NAME,TEL1,TEL2,TEL3,ADDRESS, 次にフォーマットにしたがってデータの入力を行います。 例) 12345,54321,田中,010,1234,5678,青森, 2134,6854,山本,020,3210,5439,長崎, 57404,74748,清水,030,5673,2865,岡山 ※最後の改行を忘れないように!! ------------------------------------------ データは最低この様な形にして下さい。 ------------------------------------------ 次にデータの読み込み&書き出しです。 <? print <<<EOM <table BORDER='1'> <tr> <td>ID</td> <td>パスワード</td> <td>名前</td> <td>TEL</td> <td>住所</td> </tr> EOM; $fp=FOpen("data.txt" , "r"); while(($data = FGetCsv($fp,1024)) !== FALSE){ print <<<EOM <tr> <td>$data[0]</td> <td>$data[1]</td> <td>$data[2]</td> <td>$data[3]-$data[4]-$data[5]-</td> <td>$data[6]</td> <tr> EOM; } print <<<EOM </table> EOM; fclose_sub($fp); ?> となります。 ※デバッグしていないので..... あと、検索エンジン等でCSV形式について調べてみるのもいいかもしれません。 注意:もしも,が入力された場合は,に置き換えるのを忘れずに!! 例)$name=ereg_replace(",", ',', $name);
- anmochi
- ベストアンサー率65% (1332/2045)
ん~。単純にこれではだめなのかな? for($i = 0; 終了条件(好きに決めてね); $i += 7) { print("<tr>\n"); print("<td>".$hairetu[$i + 0]."</td>\n"); print("<td>".$hairetu[$i + 1]."</td>\n"); print("<td>".$hairetu[$i + 2]."</td>\n"); print("<td>".$hairetu[$i + 3]."-".$hairetu[4]."-".$hairetu[5]."</td>\n"); print("<td>".$hairetu[$i + 6]."</td>\n"); print("<tr>\n"); }
補足
data.txt内は、今回は3つのデータを表記したのですが、データが次から次へとtxtに書き込まれるため tableには更新するたびに次から次へと件数が増えるという点と上記の終了条件を決める際に、最後の余白のところにきたら終了するという条件が考えられません。 更新する度にdata.txtには次から次へとデータが格納され結果としてtableを使用して全件を表記する。 一件目は確かにでてくるのですが、 二件目になるとでません。
お礼
当初は、改行なしのほうで進めたのですが、 後々の事を考えてまして、変えました。 とても参考になりました。 問題が解決できありがとうございました。