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

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

ただいまの
回答率

90.51%

  • PHP

    24056questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 891

singlestroke

score 39

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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を追加する。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/21 13:36

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

    キャンセル

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]とアクセスしなくてはなりません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • PHP

    24056questions

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