PHPでランダムに選択問題を出し続ける仕組みをつくる。

2019年09月13日 12時00分 正午の月齢:14.1  月名:十五夜  潮汐:大潮 月齢:14.1[十五夜] 潮汐:大潮
(最終更新日:2023年02月24日)
5年前に投稿 | ウェブ・IT関係 | 1件のコメント

9分ぐらいで読めます。

2月にある国家試験を受けたものの無残に不合格だったので、なんとか空き時間を使って勉強したいなと思いました。というわけで、選択問題が次々と出てきて回答を脳に浸み込ませるようなeラーニング環境をPHPを使って構築してみます。

とはいうものの、当然1から構築するような技術は持ち合わせていないので、いつもどおり他人のふんどしで相撲を取るしかありません。参考にしたサイトは、

さて、仕様としては、

  • 「選択問題が出る」→「ラジオボタンを選択して送信」→「正解か不正解かを表示」→「次の問題へ」が延々と繰り返される
  • 選択肢の順番と次の問題の出現はランダムに表示したい
  • 正答率や得点はどうでもいいのでただひたすら問題が出てくる

という方向でいきましょう。

トップページをつくる

それではトップページ、index.php。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>問題集</title>
</head>

<body>
<div>
<h1>問題集</h1>
<p>
<?php
$rand_file = 'q.dat';
$random = file_exists($rand_file);
$link = $random ?file($rand_file) : array();
$rand_c = count($link);
$rand_c = $rand_c - 1;
$r = rand(0, $rand_c);
$bun = $link[$r];
echo "<a href=\"{$bun}\">はじめる</a>";
?>
</p>
</div>
</body>
</html>

ピンクい部分がランダムにURLを設定してくれます。これとは別に、q.datというtxt形式のファイルを同じディレクトリ内に用意します。内容は

http://hogehoge/001.php
http://hogehoge/002.php
http://hogehoge/003.php
http://hogehoge/004.php

というふうに問題数の数だけURLを書いておきます。q.datの名前・拡張子は「url.log」みたいに変更してもOK。

問題ファイル(1問目)をつくる

次に問題のファイル。連番にしておくと管理がラクかなと思いますがお好みで。

001.php(4択問題)

<?php
$title = '金の元素記号は?';
$question = array();
$question = array('Au','Ag','As','At'); //選択肢を設定(最初の選択肢が正解)
$answer = $question[0];
shuffle($question);
?>

<!doctype html>
<html>

<head>
<meta charset="utf-8">
<meta name="robots" content="noindex, nofollow">
<title>問題</title>
</head>

<body>
<h1><?php echo $title ?></h1>
<form method="POST" action="a.php">
<p>
<?php foreach($question as $value){ ?>
<input type="radio" name="question" value="<?php echo $value; ?>"> <?php echo $value; ?><br>
<?php } ?>
<input type="radio" name="question" value="none" checked="checked" style="display:none;">
<input type="hidden" name="answer" value="<?php echo $answer ?>">
<input type="submit" value="回答する">
</p>
</form>
</body>

</html>

ピンクい部分が問題と選択肢です。配列の中の先頭に正解の答えを書いておきます。選択肢の数は増やしたり減らしたりできるのが嬉しいですネ。<input type="radio" name="question" value="none" checked="checked" style="display:none;">と表示されない選択肢を1つ入れておき、デフォルトのチェックはこの見えない選択肢につけておくことで、どの選択肢も選ばなかったときに無回答の判断をさせることにします。「<meta name="robots" content="noindex, nofollow">」属性で検索エンジンを回避します。ソースを見ると正しい答えが判ってしまうのですが…自己訓練のための仕組みなのでそんなことをする人はいないでしょう、たぶん。

問題ファイル(2問目以降)をつくる

同様に、いくつか問題を作りましょう。

002.php(3択問題)

<?php
$title = 'BTB液が青くなるのは?';
$question = array();
$question = array('アルカリ性','酸性','中性'); //選択肢を設定(最初の選択肢が正解)
$answer = $question[0];
shuffle($question);
?>

以下略(001.phpと同じ)

003.php(4択問題)

<?php
$title = 'シーフードドリアの「シーフー」の意味は?';
$question = array();
$question = array('「シーフード」ドリアなので「シーフー」ではない','「sea風」で海っぽいドドリアということ','「盗賊」という意味がある','「風刺」のギョーカイ用語'); //選択肢を設定(最初の選択肢が正解)
$answer = $question[0];
shuffle($question);
?>

以下略(001.phpと同じ)

004.php(9択問題)

<?php
$title = '必殺仕事人で勇次の武器は?';
$question = array();
$question = array('三味線の弦','銀のかんざし','脇差','ポッペン','エレキテル','怪力技','鉄のキセル','南京玉すだれ','心臓つかみ'); //選択肢を設定(最初の選択肢が正解)
$answer = $question[0];
shuffle($question);
?>

以下略(001.phpと同じ)

4つの問題ができました。

解答ページをつくる

次に答え合わせのページ。答え合わせの解説を入れるならそれぞれの問題用に答え合わせのページを作らなければなりませんが、今回は単純に正解・不正解の判定だけ行うこととして、どの問題からも共通のページとしました。

a.php

<!doctype html>
<html>

<head>
<meta charset="utf-8">
<meta name="robots" content="noindex, nofollow">
<title>結果</title>
</head>

<body>
<h1>結果</h1>
<?php
$question = $_POST['question'];
$answer = $_POST['answer'];
if($question == $answer){
$result = "正解";
}elseif($question == 'none'){
$result = "無回答";
}else{
$result = "不正解";
}
?>
<p><?php echo $result ?></p>
<p>
<?php
$rand_file = 'q.dat';
$random = file_exists($rand_file);
$link = $random ?file($rand_file) : array();
$rand_c = count($link);
$rand_c = $rand_c - 1;
$r = rand(0, $rand_c);
$bun = $link[$r];
echo "<a href=\"{$bun}\">次の問題へ</a>";
?>
</p>
<p><a href="/">トップへもどる</a></p>

</body>

</html>

問題から受け取った値で、正解・無回答・不正解を判定します。また、ランダムに次の問題を表示するリンクを用意しておきます。

ホントはcsvファイルを用意して問題と解答をすべて書き込んでおくような作りが理想的なのかもしれませんが、問題数が少なければこのように問題を個別のファイルに埋め込む方法でもなんとかなると思います。

動作サンプル

ソースコードだけではイメージがわからないよというときは、サンプルサイトをさわってみてください。

問題数が少ないと同じ問題ばかり出てくることがありますが、選択肢の順番が毎回バラバラなので正答を導く練習にはなると思います。20問以上用意したらなかなかいい感じになるのではないでしょうか。

あとは問題をガシガシ作っていくわけですが…問題を打ち込んでいるうちに答えを覚えてしまってこの仕組みの効果が薄れてしまうかも、という変な懸念があるんですよね。

PHPではないけど、QQQ SYSTEMSのCGIスクリプトは高機能です。こんなのがさくっと作れたらカッコイイんだけどなぁ。

1つ1つ問題用のPHPを作らずに、CSVファイルに問題と選択肢を載せる方法はこちら。

うん、どう考えてもこっちのほうがラクですな。

古い記事・新しい記事

古い記事 [2019年09月11日]
新しい記事 [2019年09月23日]

1件のコメント

  1. PHPで簡単にランダム選択問題を出す仕組みを作る。 | 煤式自動連結器からのピンバック | 2019年09月25日 #

    […] PHPでランダムに選択問題を出し続ける仕組みをつくる。 2月にある国家試験を受けたものの無残に不合格だったので、なんとか空き時間を使って勉強したいなと思いました。というわ […]

ごめんなさい、コメントフォームは閉鎖しています。

Translate »