phpの連想配列を使用した表示部分のコードに関して
解決済
回答 2
投稿
- 評価
- クリップ 1
- VIEW 1,748
phpの基本を勉強しています。
サンプルを参考に、下記のように作ってみました。動作することはするのですが、画面表示部分のコードが、1行ずつ具体的に何をしているのか理解できていません。
全ソースコードは下記です。
<?php
$name = ( isset($_POST["name"]) === true ) ? $_POST["name"]: "";
$comment = ( isset($_POST["comment"]) === true ) ? trim($_POST["comment"]): "";
$err_msg1 = "";
$err_msg2 = "";
$message = "";
// 投稿がある場合のみ処理を行う
if ( isset($_POST["send"]) === true ){
if ( $name === "" ) $err_msg1 = "名前を入力してください";
if ( $comment === "" ) $err_msg2 = "コメントを入力してください";
// 両方ともエラーがなければ
if ( $err_msg1 === "" && $err_msg2 === "" ){
// 追加の書き込み
$fp = fopen( "data_0320.txt", "a" );
$datas = "";
$datas = $datas.$name."\t";
$datas = $datas.$comment."\r\n";
// fwrite(ファイルポインタ、書き込み内容);
fwrite ( $fp, $datas );
$message = "書き込み成功";
}
}
$fp = fopen( "data_0320.txt", "r" );
$dataArr = array ();
while ( $res = fgets($fp) ){
$tmp = explode( "\t", $res );
$arr = array(
"name" => $tmp[0],
"comment"=> $tmp[1]
);
$dataArr[] = $arr;
}
?>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>0322掲示板</title>
</head>
<body>
<h1>掲示板20160320</h1>
<?php print $message; ?>
<form method="post" action="">
<p>名前:<input type="text" name="name" value="<?php print $name; ?>" /></p>
<p><?php print $err_msg1; ?></p>
<p>コメント:<textarea name="comment" rows="4" cols="40"><?php print $comment; ?></textarea></p>
<p><?php print $err_msg2; ?></p>
<p><input type="submit" name="send" value="投稿する" /></p>
</form>
<dl>
<?php
foreach ( $dataArr as $data ) {
print "<dt>".$data["name"]."</dt>\n";
print "<dd>".$data["comment"]."</dd>\n";
}
?>
</dl>
</body>
</html>
理解できないのは下記です。
$dataArr = array ();
while ( $res = fgets($fp) ){
$tmp = explode( "\t", $res );
$arr = array(
"name" => $tmp[0],
"comment"=> $tmp[1]
);
$dataArr[] = $arr;
}
1回の投稿をテキストファイルに格納するための配列「$dataArr」を作る
→テキストファイルから1行取得して「$res」に格納
→「$res」をタブで分けて「$tmp」に代入
→???
といった感じです。「$dataArr[] = $arr;」とか、さっぱりわかりません。
また、冗長あってもわかりやすい他の記述方法なども教えていただけますと幸いです。
よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
コード読みました。
まず、下記の部分が何をしたいのかを明確にしましょう。
$fp = fopen( "data_0320.txt", "r" );
$dataArr = array ();
while ( $res = fgets($fp) ){
$tmp = explode( "\t", $res );
$arr = array(
"name" => $tmp[0],
"comment"=> $tmp[1]
);
$dataArr[] = $arr;
}
こちらですが、data_320.txtを読み込んで、 name=> "名前" "comment" => "コメント文" という連想配列を作りたいのです。
おそらく、data_320.txt の内容は、 「山田太郎 (タブ) 山田太郎のコメントです。」といった形のデータが複数行入っていると思います。
まずは、このファイルを読み込まなければなりません。
$fp = fopen( "data_0320.txt", "r" );
data_0320.txt を読み込みモードで開きます。
次に、name => "山田太郎" comment=> "山田太郎のコメントです。" といった連想配列を、【たくさん格納する配列】を定義します。
$dataArr = array ();
最終的に、$dataArr配列はこんな形の配列データを持つことになります。
[0] => array("name" => "山田太郎", "comment" => "山田太郎の・・")
[1] => array("name" => "鈴木一朗", "comment" => "コメントコメント")
[2] => array(...
[3] => array(...
.
.
配列の要素に、連想配列を入れた形ですね。
0番目に山田太郎さんの名前とコメント、
1番目に鈴木一朗さんの名前とコメント、
・
・
・
これができたら、あとは0番目から順番に取り出せば、名前とその人のコメントがどんどん取得されることになります。
これがやりたいことです。
最終的に$dataArrがどんなデータを持つのかを強くイメージしましょう。
では、読み込んだdata_0320.txtから、データを取得しましょう。
while ( $res = fgets($fp) ){
fgets($fp) で、読み込んだdata_0320.txtデータを格納している$fpから、1行分取得します。
取得した1行分のデータは、$res変数に格納されます。
$tmp = explode( "\t", $res );
取得した1行の文字列から、explode関数によって、タブを区切りにして配列に格納していますね。
この時、$tmpはこんな形の配列データが入ります。
[0] => "山田太郎"
[1] => "山田太郎のコメントです。"
data_0320.txtの1行が、どんなデータかをよく確認してくださいね。
名前 (タブ) コメント というデータであれば、上記のようになります。
$arr = array(
"name" => $tmp[0],
"comment"=> $tmp[1]
);
$tmp配列がどんなデータを持っているか確認できれば、すぐわかると思います。
0番目には名前、1番目にはコメントが入っていますよね。
それぞれ、なんのデータか取得する時にわかりやすくするために、"name" や ”comment”などの要素名をつけています。
$dataArr[] = $arr;
さあ、取り出した1行分のデータを、$dataArrに追加しましょう。
[]をつけることで、$dataArr配列に新たに要素を作ることができます。
["要素名"]と書くこともできますが、何も書かなかった場合は、デフォルトで0から順番に数値がつきます。
while文などの繰り返し文ではよく使われる方法です。
1回目の繰り返しでは、$dataArr[0]、2回目の繰り返しでは、$dataArr[1]、、という具合に自動で番号を振ってくれます。
これによって、最終的な$dataArr配列の1行目ができました。
あとは繰り返しです。
fgets()関数によって、次の行のデータが自動で取得されます。
explodeで名前、コメントを配列にして取得して、
$arr で各々"name" , "comment" という要素名をつけた形に整形して、
$dataArrの新しい要素として$arrを追加する。
これを読み込んだファイルの最終行まで続けます。
こんなことをやっています。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
おそらく不明なのは以下の2行だと思うので、コメントにて回答します。
// $tmpだと0に名前の内容,1にコメントというように番号で指定する必要があり、わかりづらいので連想配列にしていると思われます。
$arr = array(
"name" => $tmp[0],
"comment"=> $tmp[1]
);
// $dataArrという配列の末尾に$arrを追加しています。
$dataArr[] = $arr;
// こうすることで
// $dataArr[3]['name']とすることで、4行目の名前にアクセスして多少便利に使えます
// $tmpをそのまま使用すると$dataArr[3][0]とアクセスしなくてはなりません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/03/21 13:36