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

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

ただいまの
回答率

88.04%

PHPでの二次元配列の作成

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,900

score 10

HTMLのフォームから送られてきた回答を二次元配列にしたいです。

HTMLフォーム
<form action="get.php" "method="post"">
<label for="a"><input type="radio" name="q1[]"class="btn">いぬ</label>
<label for="b"><input type="radio" name="a1[]"class="btn">ねこ</label>
<label for="c"><input type="radio" name="a1[]"class="btn">とり</label>
<input type="submit" name="" class="btn">
</form>
上記の選択からひとつ選び、PHPファイルにPOSTで送る。

PHPファイル
$_POST;
$json=json_encode($_POST);
$jresult=file_put_contents('get.json',$json,FILE_APPEND);
POSTで受け取り、jsonデータに変換、別ファイルを作成しそこに書き込みしています。

jsonのデータ形式としては、以下のような二次元配列にしたいのですがやり方がわかりませんでした。
数字部分はフォームデータが送信されるたび増えるようにできたらいいなと思っています。
{"q1":[
{"inu":8},
{"neko":4},
{"tori":11},
]}

上記のような二次元配列にするには、PHP側ではどのような記述をすればいいのでしょうか?
わかりにくかったら申し訳ありません、ご教授お願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

検証していないので動作保障は出来ませんが概ねこんな感じで。。適時var_dumpなどで内容確認して下さい。
jsonは、PHPから見て、./json/hoge.json、にあるものとします。
$json_name = './json/hoge.json';

$json = file_get_contents($json_name);
$array = json_decode($json, true); // JSONを連想配列に
$json_answers = $array['q1'];

var_dump($json_answers); // 後で消して下さい

// POSTされた値を取得
$req_ans = $_POST['answer'];

// JSON内の連想配列要素に、POSTされた要素を合致させ、+1
$json_answers[$req_ans] = $json_answers[$req_ans] + 1;

var_dump($json_answers); // +1されているのを確認。後で消して下さい。

// 新しい配列に、合算した配列を入れる
$new_array = array();
$new_array['q1'] = $json_answers;

// JSON化
$new_json=json_encode($new_array);

// 書き出し
$jresult=file_put_contents($json_name, $new_json, FILE_APPEND);
バグあったらごめんなさい。。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/19 19:53

    お返事が遅れて申し訳ないです。
    ご丁寧にありがとうございます!本当に助かりました!

    キャンセル

+1

勘違いされているか、端折って書かれたか、定かではないですが、「数字部分はフォームデータが送信されるたび増えるようにできたらいいな」とは、PHPは送られてきたPOST値に対して、集計処理を実行して、結果としてJSONを書き出す、という処理が前提になると思います。

HTML
 
<form action="get.php" "method="post"">
<label for="a"><input type="radio" name="answer" value="inu" class="btn">いぬ</label>
<label for="b"><input type="radio" name="answer" value="neko" class="btn">ねこ</label>
<label for="c"><input type="radio" name="answer" value="tori" class="btn">とり</label>
<input type="submit" name="" class="btn">
</form>

PHPの処理
 
HTMLからPOSTされる
↓
格納されているJSONファイルを読み出し。json_decodeでPHPで扱いやすくする。
inu,0
neko,0
↓
POSTされたanswerのvalue値と一致する、格納しているファイルの項目の値を足し算(基本+1かと)
inu,1
neko,0
↓
$array['q1'] = decodeして足し算した配列;
$json=json_encode($array)
↓
JSONファイル書き出し
$jresult=file_put_contents('get.json',$json,FILE_APPEND);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/19 13:35

    回答ありがとうございます!
    すみません、端折って書いてしまいました...数字~の部分は、PHPで処理するのはわかっていたのですがどういう流れになるのかはわからなかったので、為になりました。親切に書いて頂きありがとうございます。

    もしよければ、PHPの「POSTされたanswerのvalue値と一致する、格納しているファイルの項目の値を足し算」という部分の詳細なコードを書いていただけないでしょうか...自分でも考えてみたのですが、うまく処理できませんでした。質問ばかり申し訳ありません、どうかよろしくお願いいたします。

    キャンセル

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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