前提があります。
javascriptで全部やりきるか、phpで全部やりきるかを決めてください。
今現在やろうとしていることは「javascriptで合計値を出して、phpで選択した教科と点数を表示する」とお見受けしましたが、併用はできません。
回答後半でも書いていますが、phpはサーバー側の言語、javascriptはクライアント側の言語だからです。
javascriptで合計を出した後に、送信ボタンで送信するとphp側で受け取るのはチェックボックスなどの情報ですが、サーバー側にリクエストを送信することとなるので、javascriptで出した合計値は画面表示時の状態に戻ります。
つまり、
点数合計計算をjavascriptで対応するのでしたら、選択教科と点数の表示までjavascriptで対応する必要がありますし、
選択教科と点数の表示をphpで対応するのでしたら、点数合計計算もphpで対応する必要があります。
という前提で、phpでやりきる場合の回答です。
エラーの理由。
php
1$subject = $_GET["$key"]
おそらくこれは**「画面アクセス時」またはチェックボックスで「理科」を選択していないとき**
に出るのではと思います。
$_GETはクエリストリングという、URLにて渡されたパラメータを受け取るときに使います。
フォームの受け取り方は下記の記事が参考になると思います。
で、エラーが出るのは$keyという変数はforeachで使われているのですが、foreachを抜けた時点で持っているのは一番最後の情報のみです。
つまり、現在の指定
php
1
2 $array = array(
3 "体育" => 75,
4 "社会" => 58,
5 "国語" => 74,
6 "算数" => 50,
7 "理科" => 75,
8
9
10 );
↑で最後は「理科」ですね。
phpでやりきりたい場合は、下記のように組みます。
css
1.score{
2 color:#000055;
3 font-weight:bold;
4}
php
1<?php
2$total = 0;
3
4$array = array(
5 "体育" => 75,
6 "社会" => 58,
7 "国語" => 74,
8 "算数" => 50,
9 "理科" => 75,
10);
11
12foreach($array as $key => $value){
13 $checked = "";
14 if(array_key_exists($key,$_GET)){
15 $total += $_GET[$key]; //チェックされた教科の点数を加算
16 $checked = " checked"; //チェックされた教科を初期チェック状態に
17 }
18 echo '<input type="checkbox" name="'.$key.'" value="'.$value.'"'.$checked.'>'.$key.'(<span class="score">'.$value.'</span>)';
19 echo '<br>';
20}
21?>
22合計点数:<input type="text" name="_total" size="5" value="<?=$total ?>"> <input type="reset" value="やり直し">
23<input type="submit" value="送信">
※fontタグ自体、html5で廃止された要素なので、変更しています。
te2jiさんが仰っているように今回の場合、form生成を簡略化したいためにphpを利用しているような形となっていますが、この要件だけだとjavascriptだけで完結できます。
(おそらく自身のjavascriptの記述もそうしているはず)
私の回答はあえてそこをphpだけでやりきった形となります。
チェックを付けたものをテキストで出力したい
チェックを送信したものを初期値checkedにしておけば不要かなと思い、コードを作ってみました。
それでも「別途テキスト表示したい」というのであれば、
foreachの中でチェックした情報を初期値としている箇所で下記のように拾うように組めばよいです。
php
1<?php
2$total = 0;
3$check_subject = "";
4
5$array = array(
6 "体育" => 75,
7 "社会" => 58,
8 "国語" => 74,
9 "算数" => 50,
10 "理科" => 75,
11);
12
13foreach($array as $key => $value){
14 $checked = "";
15 if(array_key_exists($key,$_GET)){
16 $check_subject .= "{$key}({$_GET[$key]})"; //チェックされた教科と点数の画面出力用情報を保持
17 $total += $_GET[$key]; //チェックされた教科の点数を加算
18 $checked = " checked"; //チェックされた教科を初期チェック状態に
19 }
20 echo '<input type="checkbox" name="'.$key.'" value="'.$value.'"'.$checked.'>'.$key.'(<span class="score">'.$value.'</span>)';
21 echo '<br>';
22}
23?>
24合計点数:<input type="text" name="_total" size="5" value="<?=$total ?>"> <input type="reset" value="やり直し">
25<input type="submit" value="送信">
26<?=$check_subject ?>
補足
ただ、チェックボックスというのは、おおよその場合、「同列の情報の中で複数選択するとき」に利用するものと思われます。
通常は「配列」の形で送信するように仕込みます。
そうすると「同列の項目の中でチェックしたものだけ送信される」ようにします。
なので、今回はチェックボックスでフォームを作るのではなく、
テキストボックスで点数を入力してそれぞれのnameに教科名を入れて送信する方が
汎用的で適切な使い方になるのでは?と思います。
蛇足:
下記気になったので。
phpで生成したフォームを使ってjavascriptによる処理が上手くいったのでそこまで考えていませんでした。
phpで生成したフォーム はその時点でhtmlとして扱われるのでjavascript側は何で作ったとか関係なくあくまで今でているhtmlからのイベントを受け取って処理を行います。
あくまでphpはhtmlから送信された情報やDBの情報を処理するもので、画面出力についてはあくまで補足機能でしかない と思っておいて良いかと。