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

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

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

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

Q&A

解決済

1回答

1968閲覧

【PHP】コードの解説お願いします

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2016/11/08 08:36

下記のコードなのですが
formの部分の

php

1 <?php if (count($posts)) : ?> 2 <?php foreach ($posts as $post) : ?> 3 4<?php list($message, $user, $postedAt) = explode("\t", $post); ?> 5 <li><?php echo h($message); ?> (<?php echo h($user); ?>) - <?php echo h($postedAt); ?></li> 6 <?php endforeach; ?> 7 <?php else : ?> 8 <li>まだ投稿はありません。</li> 9 <?php endif; ?>

の部分について解説をしてほしいです。
上から三行目と四行目の

<?php list($message, $user, $postedAt) = explode("\t", $post); ?> <li><?php echo h($message); ?> (<?php echo h($user); ?>) - <?php echo h($postedAt); ?></li>

部分が特にわからないです。
この行とその下の行の関連性というかこの二つの行は何を表していますか?

PHP

1<?php 2 3$dataFile = 'bbs.dat'; 4 5function h($s) { 6 return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); 7} 8 9if ($_SERVER['REQUEST_METHOD'] == 'POST' && 10 isset($_POST['message']) && 11 isset($_POST['user'])) { 12 13 $message = trim($_POST['message']); 14 $user = trim($_POST['user']); 15 16 if ($message !== '') { 17 18 $user = ($user === '') ? 'ななしさん' : $user; 19 20 $message = str_replace("\t", ' ', $message); 21 $user = str_replace("\t", ' ', $user); 22 23 $postedAt = date('Y-m-d H:i:s'); 24 25 $newData = $message . "\t" . $user . "\t" . $postedAt. "\n"; 26 27 $fp = fopen($dataFile, 'a'); 28 fwrite($fp, $newData); 29 fclose($fp); 30 } 31} 32 33$posts = file($dataFile, FILE_IGNORE_NEW_LINES); 34 35$posts = array_reverse($posts); 36 37?> 38<!DOCTYPE html> 39<html lang="ja"> 40<head> 41 <meta charset="utf-8"> 42 <title>簡易掲示板</title> 43</head> 44<body> 45 <h1>簡易掲示板</h1> 46 <form action="" method="post"> 47 message: <input type="text" name="message"> 48 user: <input type="text" name="user"> 49 <input type="submit" value="投稿"> 50 </form> 51 <h2>投稿一覧(<?php echo count($posts); ?>件)</h2> 52 <ul> 53 <?php if (count($posts)) : ?> 54 <?php foreach ($posts as $post) : ?> 55 <?php list($message, $user, $postedAt) = explode("\t", $post); ?> 56 <li><?php echo h($message); ?> (<?php echo h($user); ?>) - <?php echo h($postedAt); ?></li> 57 <?php endforeach; ?> 58 <?php else : ?> 59 <li>まだ投稿はありません。</li> 60 <?php endif; ?> 61 </ul> 62</body> 63</html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

php

1<?php list($message, $user, $postedAt) = explode("\t", $post); ?> 2 <li><?php echo h($message); ?> (<?php echo h($user); ?>) - <?php echo h($postedAt); ?></li>

$postにはおそらくタブ区切りの文字列がはいっています。これをexplode関数はタブ文字をデリミタとして分割して配列に格納した値を返します。その配列ですが、通常のように 配列変数で受けることも可能ですが、
list関数をつかえばlist関数の引数で列挙した変数に入れる事ができます。

つまり

$arrval = explode("\t", $post);
list($message, $user, $postedAt)= explode("\t", $post);

とした時の
$arrval[0]は$message
$arrval[1]は$user
$arrval[2]は$postedAt
と等価です。

参考:
list関数
explode関数

投稿2016/11/08 08:51

hiim

総合スコア1689

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

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

退会済みユーザー

退会済みユーザー

2016/11/08 08:57

ご回答ありがとうございます。 つまりlistで0,1,2に$message,$user,$postedAtを入れてその3つの間にタブで区切りをつけているといった解釈でよろしいでしょうか? それとなぜ下の行では$postsにせっかくまとめたものをバラバラで書き込んでいるのでしょうか? どこかで function h()の処理を行って一気に$postsで表示したほうがスマートなような気がするのですがやはりそれだと何かまずいのでしょうか? なんかバラバラで書いちゃうとせっかく作った$postsが意味のないような気がして・・・。
退会済みユーザー

退会済みユーザー

2016/11/08 09:02

PHPのプログラム部分と HTMLのテキスト部分を分けているのではないでしょうか?
hiim

2016/11/08 09:14

> つまりlistで0,1,2に$message,$user,$postedAtを入れてその3つの間にタブで区切りをつけているといった解釈でよろしいでしょうか 近いけど少し違います。「0,1,2に$message,$user,$postedAtを入れて」の部分がすこし言葉に語弊があるような気がします。ようはlist関数は複数の変数に一気に値を入れたい時に使います。 > $postsにせっかくまとめたものをバラバラで書き込んでいるのでしょうか $postsは'bbs.dat'からファイル読み込みを行って得た行を要素とした配列ですので配列は今回のようにforeach分で1要素づつ分けて表示しないといけません、というよりたとえば echo $posts なんて書いたら array としか出ないと思います。 次に行に相当する$postはタブ文字区切りで必要な情報(単語)が入っているのでそれぞれに分けてからエスケープ関数を適応しているのでいたって普通だと思います。先に$postにエスケープしょりしてからタブ文字を文字置換で一つ目のタブを'('に置換、2こめのタブを')-'に置換の方がスマートでないように思います。
退会済みユーザー

退会済みユーザー

2016/11/08 10:48

>>hiim様 .$postsは'bbs.dat'からファイル読み込みを行って得た行を要素とした配列ですので配列は今回のようにforeach分で1要素づつ分けて表示しないといけません の部分がいまいち理解できません 例えばbbs.datに3つ書き込まれていたら3行書き込まれているということですが三行分foreachで回すといった感じなのでしょうか? このforeachの用途がわかりません><
hiim

2016/11/08 11:00

Furisukeさんがphpの勉強をどこまでされているかわかりませんが、配列に関してはもう勉強すみですか? 例えば配列$arrValに $arrval[0] = '1行目'; $arrval[1] = '2行目'; $arrval[2] = '3行目'; $arrval[3] = '4行目'; 〜略〜 $arrval[99] = '100行目'; という配列があった場合、この配列をブラウザに表示する時はどうしますか? さきほどの質問の「一気に$postsで表示したほうが」に相当するのが一気に$arrvalで表示となるとおもいますが、 echo($arrval); とか printf($arrval); では目的の表示にならないのはわかりますか? こいういう時は foreach($arrval as $val) { printf("%s<br>",$val); } とすると 1行目 2行目 3行目 4行目 〜略〜 100行目 と表示されます。 配列をそのまま表示という事はデータの形式上できないのです。 質問者さんの別の質問でforeach($posts as $post)の$postの意味を質問されてましたが 同じです。 foreachのマニュアルは http://php.net/manual/ja/control-structures.foreach.php を参照してください。 今回の質問では list関数 explode関数 のマニュアルのリンクも解答欄に記載しましたが、 phpを勉強するにあたり、標準関数は絶対にマニュアルに目を通してください。 関数の意味・役割・使い方全て書いてますから
退会済みユーザー

退会済みユーザー

2016/11/08 11:14

なるほど!! すごく理解できました 大変わかりやすくご教授していただき本当にありがとうございます すっきりしました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問