質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

6833閲覧

foreachで配列をhtml内で改行させて出力したい

heysuky

総合スコア21

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/03/12 14:03

編集2019/03/14 12:14

前提・実現したいこと

inputで作った枠に書き込みされた値を$dataに配列として格納し、それをhtml内でforeachで出力して表示しているのですが、1列ではなく書き込みされた値ごとに改行させて表示させたいです。
何かいい方法はありますでしょうか?

--質問修正を受けて追記--

失礼しました。遅くなってしまい申し訳ありません。具体的にはhtmlで出力された時に、例えば

2019-03-14 07:00:00 今日は天気がよかった
2019-03-15 07:00:00 今日は天気が悪かった
2019-03-16 07:00:00 今日も天気が悪かった

このように改行させて表示させたいのですが、
今自分がやった内容のままだとchallenge_log.txtでは
"2019-03-14 21:12:26 今日は天気がよかった2019-03-14 21:12:33 今日は天気が悪かった2019-03-14 21:12:38 今日も天気が悪かった"
このように1行で、新しいコメントを送信すると空白なしで表示されます。

試したこと

php内でforeach文を書く時は<br />を使えばよかったので簡単だったのですが、html内でそれをやっても上手く行きませんでした。
HTML内の下の方にある <p><?php print $read; ?></p>というコードのところに<br />や\nを入れても全く変化がありませんでした。

PHP

1<?php 2 3$filename = './challenge_log.txt'; 4$comment = ''; 5$log = date('Y-m-d H:i:s') . " "; 6 7if ($_SERVER['REQUEST_METHOD'] === 'POST') { 8 9 if (isset($_POST['comment']) === TRUE) { 10 $comment = $_POST['comment']; 11 } 12 13 if (($fp = fopen($filename, 'a')) !== FALSE) { 14 if (fwrite($fp, $log) === FALSE) { 15 print 'ファイル書き込み失敗: ' . $filename; 16 } 17 fclose($fp); 18 } 19 20 if (($fp = fopen($filename, 'a')) !== FALSE) { 21 if (fwrite($fp, $comment) === FALSE) { 22 print 'ファイル書き込み失敗: ' . $filename; 23 } 24 fclose($fp); 25 } 26} 27 28$data = array(); 29 30if (is_readable($filename) === TRUE) { 31 if (($fp = fopen($filename, 'r')) !== FALSE) { 32 while (($tmp = fgets($fp)) !== FALSE) { 33 $data[] = htmlspecialchars($tmp, ENT_QUOTES, 'UTF-8'); 34 } 35 fclose($fp); 36 } 37} else { 38 $data[] = 'ファイルがありません'; 39} 40?> 41<!DOCTYPE html> 42<html lang="ja"> 43 <head> 44 <meta charset="UTF-8"> 45 </head> 46 <body> 47 <form method="post"> 48 発言 49 <input type="text" name="comment"> 50 <input type="submit" value="送信"> 51 </form> 52 <p>発言一覧</p> 53<?php foreach ($data as $read) { ?> 54この下の$readの所に 55 <p><?php print $read; ?></p> 56<?php } ?> 57 </body> 58</html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/03/12 14:45

どうしたいのかをもっと明確にしてください。
mather

2019/03/12 14:56

challenge_log.txt に記録されている内容(テスト時に試したもの)をそのまま質問に貼り付けて、 それが具体的にHTMLになったときにどうなっててほしいかを書いてください。
heysuky

2019/03/14 12:15

失礼しました。遅くなってしまいましたが更新しました。
guest

回答2

0

fgetsは問題があり、改行コードがLFしか認識できません。したがって、$data関数に代入された時点で、一行の文字列として入っている可能性が非常に高いです。

それを防ぐにはphp.iniでauto_detect_line_encodingの設定をon
にする必要があります。ひょっとしたらini_set関数も使えるかも知れませんので、おまじないだと思って、行頭に以下の文を付け加えてみてください。

PHP

1ini_Set("auto_detect_line_ending" ,"on");

それができたら、foreach文内で<br/>タグを使えば普通に行けるでしょう。

補足
その埋め込み方より

<?php foreach($data as $read): ?> <?php endforeach; ?>

の方がいいですよ。

投稿2019/03/12 15:23

編集2019/03/12 15:24
FKM

総合スコア3633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

heysuky

2019/03/14 12:46

両方とも初めて見たので調べてみました。 ini_setはちょっと理解が深められなくて試してみてもできなかったのですが、endforeachとても見やすくなりました。さっそく書いてみました。ありがとうございます!
FKM

2019/03/14 12:54 編集

ini_setはphp.iniで行う設定をそのファイル限定で使いたい場合とかに使用する関数です。
heysuky

2019/03/14 13:07

詳細ありがとうございます。\nでできたのでとりあえずそちらを使用して、ini_setは後学のために覚えさせていただきます。ありがとうございました。
guest

0

ベストアンサー

txtファイルに改行した状態で書き込まれるように下記のようにすれば解決すると思います。

html

1$comment = $_POST['comment'] . "\n";

ただ、提示されたコードのままでは値が空でも日付だけの書き込みを行ってしまうので、$_POSTの値はそのまま書き込みに使わず、一旦バリデーション処理などを入れることをお勧めします。

投稿2019/03/12 15:21

cerfweb

総合スコア1899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

heysuky

2019/03/14 12:22

回答ありがとうございます。試してみたらできました。 そこに\nを入れればよかったのですね! commentの部分はisset === TRUEで値がある場合のみに表示するようにしているのですが、$logもそうしなければならないということですよね。 ありがとうございます。やってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問