シャッフルしたデータを正確に引き継ぎたい

このQ&Aのポイント
  • 試験問題のプログラムを作っています。MySQLに格納されている問題文と選択肢をシャッフルして表示し、ユーザーからは見えない選択肢aを選ぶと正解で得点が1カウントされるものです。
  • 問題用紙のページではきちんと問題と選択肢が表示されるのですが、セッションを使い採点のページに進むとMySQLに入っている問題文と選択肢が大量に表示されてしまいました。
  • ユーザーが採点のページに進むとどの問題を間違えたのか確認できるように問題用紙のページと同じように表示させたいのですが、これはどのようにコードを書けばよいのでしょうか?
回答を見る
  • ベストアンサー

シャッフルしたデータを正確に引き継ぎたい

試験問題のプログラムを作っています。 MySQLに格納されている問題文と選択肢をシャッフルして表示し、ユーザーからは見えない選択肢aを選ぶと正解で得点が1カウントされるものです。 問題用紙のページではきちんと問題と選択肢が表示されるのですが、セッションを使い採点のページに進むとMySQLに入っている問題文と選択肢が大量に表示されてしまいました。 ユーザーが採点のページに進むとどの問題を間違えたのか確認できるように問題用紙のページと同じように表示させたいのですが、これはどのようにコードを書けばよいのでしょうか? どうぞよろしくお願い致します。 //問題用紙のページ <?php session_start(); ?> <form method="post" action="grading.php"> <?php $arr = array(); while ($row = mysqli_fetch_array($result)){ $arr[] = $row; } shuffle($arr); $cnt = 0; foreach($arr as $row){ if($cnt >= 3){break;} print $row['question']; print "<BR>"; $choices = array(); $choices['a'] = "<INPUT type=radio name=radi_".$cnt." value=a>".$row['choices_a']."<BR>"; $choices['b'] = "<INPUT type=radio name=radi_".$cnt." value=b>".$row['choices_b']."<BR>"; shuffle($choices); foreach($choices as $val){ print $val; } session_register('sesdata_q'); session_register('sesdata_a'); session_register('sesdata_b'); $_SESSION['sesdata_q'][] = $row['question']; $_SESSION['sesdata_a'][] = $row['choices_a']; $_SESSION['sesdata_b'][] = $row['choices_b']; print "<BR>"; $cnt++; } ?> <INPUT type="submit" value=" 採点 " name="grading"> //採点のページ <?php session_start(); $score = 0; $answer = $_POST['radi_0']; if($answer == 'a'){ $score++; } $answer = $_POST['radi_1']; if($answer == 'a'){ $score++; }print "3問中" . $score . "問正解"; print "<br>"; foreach($_SESSION['sesdata_q'] as $val){ print $val."<BR><BR>"; } foreach($_SESSION['sesdata_a'] as $val){ print $val."<BR><BR>"; } foreach($_SESSION['sesdata_b'] as $val){ print $val."<BR><BR>"; } ?>

  • PHP
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

とりあえず書いてみたので参考までに //situmon.php <?PHP session_start(); //mysqlへの接続 $sql="SELECT * FROM test ORDER BY RAND() LIMIT 3"; $res=mysql_query($sql); while($row=mysql_fetch_array($res,MYSQL_ASSOC)){ $a=&$arr[]; $a["question"]=$row["question"]; $temp[0]["key"]="a"; $temp[0]["value"]=$row["choices_a"]; $temp[1]["key"]="b"; $temp[1]["value"]=$row["choices_b"]; shuffle($temp); $a["answer"]=$temp; unset($temp,$a); } $_SESSION["arr"]=$arr;//シャッフルした状態でセッションに流す ?> <form action="kaito.php"> <?PHP foreach($arr as $key=>$a){ print "質問".($key+1).")".$a["question"]."<br>\n"; foreach($a["answer"] as $answer){ print "<input type=\"radio\" name=\"q[".$key."]\" value=\"".$answer["key"]."\">".$answer["value"]."<br>\n"; } } ?> <input type="submit" value="回答する"> </form> //kaito.php <?PHP session_start(); $arr=$_SESSION["arr"]; $count=0; foreach($arr as $key=>$a){ print "質問".($key+1).")".$a["question"]."<br>\n"; foreach($a["answer"] as $answer){ if($answer["key"]==="a"){ print "<span style=\"color:blue\">[正解]"; } print $answer["value"]; if($answer["key"]===$_REQUEST["q"][$key]){ print " ・・・あなたの選択"; } print "</span><br>\n"; } if($_REQUEST["q"][$key]==="a"){ $count++; } } print "<span style=\"color:red\">".$count."問正解!!\n<hr>\n"; ?> [ <a href="situmon.php">質問へ</a> ]

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ちょっと確認、 (1)質問自体をランダムに3問表示したい? (2)回答の選択肢は2つでそれもシャッフルしたい? (3)答え合わせのページでは正解・不正解をとわず問題と回答をかく? とくに3番の提示が中途半端?

関連するQ&A

  • シャッフルした変数を正しく表示するには?

    多肢選択式試験問題のプログラムを作っています。 MySQLに格納されている各問題と選択肢をシャッフルして出題し、セッションを使って採点ページに進むと出題された問題と選択肢を表示させたいのです。 しかし下記のソースだと問題と選択肢が1題分しか表示されず、選択肢も出題ページに表示された順番には並んでくれません。 これはどうしたらいいのでしょうか?よろしくお願い致します。 //出題のページ ※選択肢Aを選ぶと正解になります。 <?php session_start(); ?> $arr = array(); while ($row = mysqli_fetch_array($result)){ $arr[] = $row; } shuffle($arr); $cnt = 0; foreach($arr as $row){ if($cnt >= 2){break;} print $row['question']; print "<BR>"; $choices = array(); $choices['a'] = "<INPUT type=radio name=radi_".$cnt." value=a>".$row['choices_a']."<BR>"; $choices['b'] = "<INPUT type=radio name=radi_".$cnt." value=b>".$row['choices_b']."<BR>"; $choices['c'] = "<INPUT type=radio name=radi_".$cnt." value=c>".$row['choices_c']."<BR>"; $choices['d'] = "<INPUT type=radio name=radi_".$cnt." value=d>".$row['choices_d']."<BR>"; session_register(sesdata_q); session_register(sesdata_a); session_register(sesdata_b); session_register(sesdata_c); session_register(sesdata_d); $_SESSION[sesdata_q] = $row['question']; $_SESSION[sesdata_a] = $row['choices_a']; $_SESSION[sesdata_b] = $row['choices_b']; $_SESSION[sesdata_c] = $row['choices_c']; $_SESSION[sesdata_d] = $row['choices_d']; shuffle($choices); foreach($choices as $val){ print $val; } print "<BR>"; $cnt++; } ?> //採点のページ <?php $score = 0; $answer = $_POST['radi_0']; if($answer == 'a'){ $score++; } $answer = $_POST['radi_1']; if($answer == 'a'){ $score++; } $answer = $_POST['radi_2']; if($answer == 'a'){ $score++; } $answer = $_POST['radi_3']; if($answer == 'a'){ $score++; } print "2問中" . $score . "問正解"; print "<br>"; print "<br>"; print $_SESSION[sesdata_q]; print "<br>"; print $_SESSION[sesdata_a]; print "<br>"; print $_SESSION[sesdata_b]; print "<br>"; print $_SESSION[sesdata_c]; print "<br>"; print $_SESSION[sesdata_d]; ?>

    • 締切済み
    • PHP
  • MySQLから取ってきた配列のデータを利用するには

    MySQLから取ってきた配列のデータをラジオボタンのフォームに入れて、別のPHPファイルでチェックを確認したいのですが、うまくいきません。 下記のソースが実際のものになります。radi_".$cnt." の値をどうやって取得するのでしょうか?$answer = $_POST("radi_1");では動いてくれませんでした。 どうぞよろしくお願い致します。 $choices['a'] = "<INPUT type=radio name=radi_".$cnt." value=a>".$row['choices_a']."<BR>";

    • 締切済み
    • PHP
  • array_randで要素が数字の場合の処理方法

    PHPのarray_randについて教えて下さい。 下記のようなソースを作りましたが思った通りの結果になりません。 //(A) $test=array(3,5,8,11,14,24,26,28); print_r($test); foreach ($test as $val) { echo $val.'<br>'; } //(B) $keys = array_rand($test, 5);//決められた数を抽出 print_r($keys).'<br><br>'; foreach ($keys as $val) { echo $val.'<br>'; } Aの部分の結果は Array ( [0] => 3 [1] => 5 [2] => 8 [3] => 11 [4] => 14 [5] => 24 [6] => 26 [7] => 28 ) foreachの部分の出力↓ 3 5 8 11 14 24 26 28 となりこれは特に問題ありません。 Bの部分でAの配列から5つランダムで取り出したいのですが、結果は Array ( [0] => 0 [1] => 3 [2] => 5 [3] => 6 [4] => 7 ) 0 foreachの部分の出力↓ 0 3 5 6 7 となってしまい、Aの配列の添え字の中から5つの数字が選ばれるようになってしまいます。 Aの添え字ではなく「3,5,8,11,14,24,26,28」の数字から5つランダムで取り出すにはどのような書き方をすればよいのでしょうか? ご回答よろしくお願い致します。

    • ベストアンサー
    • PHP
  • foreach文について、今朝、回答いただいて、その時は分かったつもり

    foreach文について、今朝、回答いただいて、その時は分かったつもりだったのですが、 やっぱりよく分かっていなかったようなので、もう一度質問させてください。 今朝質問した内容は、下記です。 ▼配列の要素の値をループ中に変更して確認したいのですが、   http://okwave.jp/qa/q5943567.html 例えば、下記例のとき、上記と挙動が異なるのは、なぜでしょう? このforeachでは、値を書き換えできないので、 そもそも、上記と比較をしてはいけないのでしょうか? $arr = array("値1", "キー1" => "値2", "値3"); foreach($arr as $val){ $val = "{$val}の値利用"; echo $val."<br />"; } foreach($arr as $val){ echo $val."<br />"; } 1)$arrの内容を$valにコピー 2)$valに値を代入 3)$valを表示 4)1)へ戻る で、特に分からないのが、以下です。 上のforeachで、 代入後の値が表示されるのは、 なぜでしょうか。 今朝質問した「$arr as $key => $val」 のときと比較して、 どなたか解説していただけないでしょうか?

    • ベストアンサー
    • PHP
  • 配列の要素の値をループ中に変更して確認したいのですが、下記やり方では、

    配列の要素の値をループ中に変更して確認したいのですが、下記やり方では、なぜダメなのでしょうか? $arr = array("値1", "キー1" => "値2", "値3"); foreach($arr as $key => $val){ $arr[$key] = "-{$val}-"; echo $val."<br />"; } foreach($arr as $key => $val){ echo "<br />".$val; } 上のforeachの結果が、下と同じようになると期待したのですが、うまくいきません。 なんで、上のforeachと下のforeachの結果が異なるのでしょうか? foreach文で要素の値が更新されるのは、foreach文が終了した瞬間なのでしょうか。 それとも、値はすぐに更新されているけれども、foreach文の処理(順番に抽出する作業?)は既にスタートしてしまっているので、ループ中に更新されても、途中で反映することはできない、ということなのでしょうか? さっぱり分からないので、誰か教えてください。 「配列の要素の値をループ中に変更して確認したい」というよりは、 「なんで、二つのforeach文で結果が異なるか知りたい」です。

    • ベストアンサー
    • PHP
  • シャッフルした後で最初の2項目だけを表示させたい

    小テストのプログラムなのですが、ソースには問題文を3題分用意して、ページを開くたびにランダムに2題だけを表示させるにはどうしたらいいのでしょうか? おそらくfor文で指定するのだと思いますが、うまく動いてくれません。 どうぞよろしくお願いいたします。 <? $QA[]=array( "Q"=>array("id"=>"q1","text"=>"質問A") ,"A"=>array( array("key"=>1,"text"=>"回答A-1") ,array("key"=>2,"text"=>"回答A-2") ,array("key"=>3,"text"=>"回答A-3") ,array("key"=>4,"text"=>"回答A-4") ) ); $QA[]=array( "Q"=>array("id"=>"q2","text"=>"質問B") ,"A"=>array( array("key"=>1,"text"=>"回答B-1") ,array("key"=>2,"text"=>"回答B-2") ,array("key"=>3,"text"=>"回答B-3") ,array("key"=>4,"text"=>"回答B-4") ) ); $QA[]=array( "Q"=>array("id"=>"q3","text"=>"質問C") ,"A"=>array( array("key"=>1,"text"=>"回答C-1") ,array("key"=>2,"text"=>"回答C-2") ,array("key"=>3,"text"=>"回答C-3") ,array("key"=>4,"text"=>"回答C-4") ) ); shuffle($QA); $q_no=1; foreach($QA as $arr1){ shuffle($arr1["A"]); print "問".$q_no.")".$arr1["Q"]["text"]."<br>\n"; foreach($arr1["A"] as $arr2){ $id=$arr1["Q"]["id"]."_".$arr2["key"]; print "<INPUT type=\"radio\" id=\"".$id."\" name=\"".$arr1["Q"]["id"]."\" value=\"".$arr2["key"]."\"><label for=\"".$id."\">".$arr2["text"]."</label><br>\n"; } $q_no++; } ?>

    • ベストアンサー
    • PHP
  • セッションについて教えてください。

    ラジオボタンを使った選択式の小テストのプログラムを作っています。テストのページを複数にしたいのですが、どのようにセッション関数を使えば良いのか分かりません。 下記のプログラムですと、1ページ目に答えた内容が2ページ目で上書きされてしまうようです。 どうぞよろしくお願いいたします。 1~2ページ目(テストのページ) <? $QA[]=array( "Q"=>array("id"=>"q1","text"=>"質問A") ,"A"=>array( array("key"=>1,"text"=>"回答A-1") ,array("key"=>2,"text"=>"回答A-2") ,array("key"=>3,"text"=>"回答A-3") ,array("key"=>4,"text"=>"回答A-4") ) ); $QA[]=array( "Q"=>array("id"=>"q2","text"=>"質問B") ,"A"=>array( array("key"=>1,"text"=>"回答B-1") ,array("key"=>2,"text"=>"回答B-2") ,array("key"=>3,"text"=>"回答B-3") ,array("key"=>4,"text"=>"回答B-4") ) ); shuffle($QA); $q_no=1; foreach($QA as $arr1){ shuffle($arr1["A"]); print "問".$q_no." ".$arr1["Q"]["text"]."<br>\n"; foreach($arr1["A"] as $arr2){ $id=$arr1["Q"]["id"]."_".$arr2["key"]; print "<INPUT type=\"radio\" id=\"".$id."\" name=\"".$arr1["Q"]["id"]."\" value=\"".$arr2["key"]."\"><label for=\"".$id."\">".$arr2["text"]."</label><br>\n"; } if($q_no >= 2){ break; } $q_no++; } ?> 3ページ目(採点ページ) <?php $tokuten = 0; $seikaisuu = 0; $answer = $_POST["q1"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = +1; } $answer = $_POST["q2"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } $answer = $_POST["q3"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } $answer = $_POST["q4"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } print "正解数 " . $seikaisuu . "問"; print "<br>"; print "合計点 " . $tokuten . "点"; ?>

    • ベストアンサー
    • PHP
  • 参照変数の親配列を取得

    データの多次元配列があって、値に応じて動的に関数を選択し 中身の値を引数で渡すみたいな感じの処理をしています ほとんどの処理は中身の値だけあれば事足りるのですが 稀にキー値を使いたい処理がでてきます 本当に稀なので引数にキー値も渡すようにするのは 無駄が多くなるように思うので避けたく できれば参照変数で渡される値から 親配列でのキー値を取得したいと思っています $arr2A=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); $arr2B=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); $arr2C=array('a'=>array('fnc'=>'A','あ','い','う'),'b'=>array('fnc'=>'B','か','き','く'),'c'=>array('fnc'=>'C','さ','し','す')); foreach($arr2A as $key=>$val){ $fncs[$val['fnc']]($val); } foreach($arr2B as $key=>$val){ $fncs[$val['fnc']]($val); } foreach($arr2C as $key=>$val){ $fncs[$val['fnc']]($val); } $fncs=array( A=>function(&$arr){ }, B=>function(&$arr){ }, C=>function(&$arr){ //ここで稀にキー値も使いたい }); 実際のコードはかなり長いので載せられませんが 要約すると上記のような感じの処理です まずどのデータ配列の集合から渡されたのかが明確ではありませんので indexOfなどでキー値を得るのというのが難しいです 現在は、その処理が必要なデータ行について処理前に 中身にキー値をあらかじめ入れてしまう というように対応しているので、一応解決はしているのですが もし参照変数から親配列を得る方法が あればと思い質問させていただきました ”そんなものはない”という回答も あきらめつくのでお願いします

    • ベストアンサー
    • PHP
  • 前後のデータ

    お世話になります。 先日、「外部テキストに保存されているデータを読み込んで、任意のデータで並べ替えたいです。」と言う質問をさせて頂き、結果を得ることが出来たのですが、次のステップで又行き詰まってしまいました。 今度は、前の人と次の人を取得してリンクで繋ぎたいです。 宜しくお願いします。 data.txtには、次の様なデータが格納されてます。 namae<>なまえ<>23<>2008/04/01<> namae<>なまえ<>23<>2008/04/01<> namae<>なまえ<>23<>2008/04/01<> ------------------------------------------------------------------ /* 名前比較用の関数 */ function namecmp($a, $b) {  return strcmp($a[1], $b[1]); } $list = file("data.txt"); foreach ($list as $line) {  // 一度配列に格納  $arr[] = explode("<>", $line); } // ソート usort($arr, "namecmp"); for($i = 0; $i < count($arr); $i++) {  list($data01, $data02, $data03, $data04) = $arr[$i];  print $data02 . ":" . $data04 . "<br>\n";  print "<a href=\"前の人の".$data01.".html\"></a>  print "<a href=\"次の人の".$data01.".html\"></a> } ------------------------------------------------------------------

    • 締切済み
    • PHP
  • PHPでMySQLのデータを2次元配列に格納する

    PHPの本に $r = mysql_query("SELECT * FROM tb;"); while ($row = mysql_fetch_array($r)){ print "{$row['id']}{$row['title']}<BR>"; } とあったのですが1行ずつしか保存できないので 2次元配列row[][]で while ($row[] = mysql_fetch_array($r)){ } foreach($row as $v){ print "{$v['id']}{$v['title']}<BR>"; } このようにコーディングしたところ 一応うまく表示されたのですが、問題はないですか? もし普通はこういう風にするみたいなやり方があれば 教えて欲しいです。

    • ベストアンサー
    • PHP

専門家に質問してみよう