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

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

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

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

Q&A

解決済

2回答

2398閲覧

phpの連想配列を使用した表示部分のコードに関して

singlestroke

総合スコア68

PHP

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

0グッド

1クリップ

投稿2016/03/20 13:53

phpの基本を勉強しています。
サンプルを参考に、下記のように作ってみました。動作することはするのですが、画面表示部分のコードが、1行ずつ具体的に何をしているのか理解できていません。

全ソースコードは下記です。

php

1<?php 2 3$name = ( isset($_POST["name"]) === true ) ? $_POST["name"]: ""; 4$comment = ( isset($_POST["comment"]) === true ) ? trim($_POST["comment"]): ""; 5$err_msg1 = ""; 6$err_msg2 = ""; 7$message = ""; 8 9// 投稿がある場合のみ処理を行う 10if ( isset($_POST["send"]) === true ){ 11 if ( $name === "" ) $err_msg1 = "名前を入力してください"; 12 if ( $comment === "" ) $err_msg2 = "コメントを入力してください"; 13 // 両方ともエラーがなければ 14 if ( $err_msg1 === "" && $err_msg2 === "" ){ 15 // 追加の書き込み 16 $fp = fopen( "data_0320.txt", "a" ); 17 $datas = ""; 18 $datas = $datas.$name."\t"; 19 $datas = $datas.$comment."\r\n"; 20 // fwrite(ファイルポインタ、書き込み内容); 21 fwrite ( $fp, $datas ); 22 $message = "書き込み成功"; 23 } 24} 25 26$fp = fopen( "data_0320.txt", "r" ); 27 28$dataArr = array (); 29while ( $res = fgets($fp) ){ 30 $tmp = explode( "\t", $res ); 31 $arr = array( 32 "name" => $tmp[0], 33 "comment"=> $tmp[1] 34 ); 35 $dataArr[] = $arr; 36} 37?> 38<html lang="ja"> 39<head> 40<meta charset="UTF-8" /> 41<title>0322掲示板</title> 42</head> 43<body> 44<h1>掲示板20160320</h1> 45<?php print $message; ?> 46<form method="post" action=""> 47<p>名前:<input type="text" name="name" value="<?php print $name; ?>" /></p> 48<p><?php print $err_msg1; ?></p> 49 50<p>コメント:<textarea name="comment" rows="4" cols="40"><?php print $comment; ?></textarea></p> 51<p><?php print $err_msg2; ?></p> 52 53<p><input type="submit" name="send" value="投稿する" /></p> 54</form> 55<dl> 56 <?php 57 foreach ( $dataArr as $data ) { 58 print "<dt>".$data["name"]."</dt>\n"; 59 print "<dd>".$data["comment"]."</dd>\n"; 60 } 61 ?> 62</dl> 63</body> 64</html>

理解できないのは下記です。

php

1$dataArr = array (); 2while ( $res = fgets($fp) ){ 3 $tmp = explode( "\t", $res ); 4 $arr = array( 5 "name" => $tmp[0], 6 "comment"=> $tmp[1] 7 ); 8 $dataArr[] = $arr; 9}

1回の投稿をテキストファイルに格納するための配列「$dataArr」を作る
→テキストファイルから1行取得して「$res」に格納
→「$res」をタブで分けて「$tmp」に代入
→???
といった感じです。「$dataArr[] = $arr;」とか、さっぱりわかりません。

また、冗長あってもわかりやすい他の記述方法なども教えていただけますと幸いです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

コード読みました。
まず、下記の部分が何をしたいのかを明確にしましょう。

php

1$fp = fopen( "data_0320.txt", "r" ); 2 3$dataArr = array (); 4while ( $res = fgets($fp) ){ 5 $tmp = explode( "\t", $res ); 6 $arr = array( 7 "name" => $tmp[0], 8 "comment"=> $tmp[1] 9 ); 10 $dataArr[] = $arr; 11}

こちらですが、data_320.txtを読み込んで、 name=> "名前" "comment" => "コメント文" という連想配列を作りたいのです。

おそらく、data_320.txt の内容は、 「山田太郎 (タブ) 山田太郎のコメントです。」といった形のデータが複数行入っていると思います。

まずは、このファイルを読み込まなければなりません。

php

1$fp = fopen( "data_0320.txt", "r" );

data_0320.txt を読み込みモードで開きます。

次に、name => "山田太郎" comment=> "山田太郎のコメントです。" といった連想配列を、【たくさん格納する配列】を定義します。

php

1$dataArr = array ();

最終的に、$dataArr配列はこんな形の配列データを持つことになります。

php

1[0] => array("name" => "山田太郎", "comment" => "山田太郎の・・") 2[1] => array("name" => "鈴木一朗", "comment" => "コメントコメント") 3[2] => array(... 4[3] => array(... 5. 6. 7

配列の要素に、連想配列を入れた形ですね。

0番目に山田太郎さんの名前とコメント、
1番目に鈴木一朗さんの名前とコメント、



これができたら、あとは0番目から順番に取り出せば、名前とその人のコメントがどんどん取得されることになります。

これがやりたいことです。
最終的に$dataArrがどんなデータを持つのかを強くイメージしましょう。

では、読み込んだdata_0320.txtから、データを取得しましょう。

php

1while ( $res = fgets($fp) ){

fgets($fp) で、読み込んだdata_0320.txtデータを格納している$fpから、1行分取得します。
取得した1行分のデータは、$res変数に格納されます。

php

1$tmp = explode( "\t", $res );

取得した1行の文字列から、explode関数によって、タブを区切りにして配列に格納していますね。
この時、$tmpはこんな形の配列データが入ります。

php

1[0] => "山田太郎" 2[1] => "山田太郎のコメントです。"

data_0320.txtの1行が、どんなデータかをよく確認してくださいね。
名前 (タブ) コメント というデータであれば、上記のようになります。

php

1$arr = array( 2 "name" => $tmp[0], 3 "comment"=> $tmp[1] 4 );

$tmp配列がどんなデータを持っているか確認できれば、すぐわかると思います。
0番目には名前、1番目にはコメントが入っていますよね。
それぞれ、なんのデータか取得する時にわかりやすくするために、"name" や ”comment”などの要素名をつけています。

php

1$dataArr[] = $arr;

さあ、取り出した1行分のデータを、$dataArrに追加しましょう。
[]をつけることで、$dataArr配列に新たに要素を作ることができます。
["要素名"]と書くこともできますが、何も書かなかった場合は、デフォルトで0から順番に数値がつきます。

while文などの繰り返し文ではよく使われる方法です。
1回目の繰り返しでは、$dataArr[0]、2回目の繰り返しでは、$dataArr[1]、、という具合に自動で番号を振ってくれます。

これによって、最終的な$dataArr配列の1行目ができました。

あとは繰り返しです。
fgets()関数によって、次の行のデータが自動で取得されます。
explodeで名前、コメントを配列にして取得して、
$arr で各々"name" , "comment" という要素名をつけた形に整形して、
$dataArrの新しい要素として$arrを追加する。

これを読み込んだファイルの最終行まで続けます。
こんなことをやっています。

投稿2016/03/20 15:42

Iya712

総合スコア158

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

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

singlestroke

2016/03/21 04:36

とてもわかりやすい解説ありがとうございました。おかげさまで理解できました。
guest

0

おそらく不明なのは以下の2行だと思うので、コメントにて回答します。

php

1// $tmpだと0に名前の内容,1にコメントというように番号で指定する必要があり、わかりづらいので連想配列にしていると思われます。 2$arr = array( 3 "name" => $tmp[0], 4 "comment"=> $tmp[1] 5 ); 6 7// $dataArrという配列の末尾に$arrを追加しています。 8$dataArr[] = $arr; 9 10// こうすることで 11// $dataArr[3]['name']とすることで、4行目の名前にアクセスして多少便利に使えます 12// $tmpをそのまま使用すると$dataArr[3][0]とアクセスしなくてはなりません。

投稿2016/03/20 14:39

sekitaka_1214

総合スコア509

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問