Q1.100人分のデータを作成する。一つ一つのデータは名前と点数で構成されていて名前はA~F,点数は0〜999のランダムな値をとる。生成した100人分のデータから上位10名を以下のフォーマットで出力せよ。

<?php
//クラスを作成する
class Person{
//フィールド
public $name;
public $score;
//コンストラクタ
function __construct($name,$score){
$this->name=$name;
$this->score=$score;
}
//メソッド
function toString(){
return "{$this->name}[{$this->score}]";
}
}
//何人分生成するか
const PERSON_NUM=100;
//点数のMAX
const MAX_SCORE=999;
//上位何人取得するか
const LIMIT=10;
//名前のリスト
$names=['A','B','C','D','E','F'];
//Personインスタンスを格納する配列
$data=[];
//データ生成
for($i=0;$i<PERSON_NUM;$i++){
//名前を決定
$name=$names[mt_rand(0,count($names)-1)];
//点数を生成(端含む)
$score=mt_rand(0,MAX_SCORE);
//Personインスタンスを生成
$person=new Person($name,$score);
//配列に追加
$data[]=$person;
}
//compareを定義(Personの点数降順)
function cmp($person1,$person2){
return $person2->score - $person1->score;
}
//並び替えusort(配列,compare名)
usort($data,'cmp');
/*第2引数で無名関数を使って直接定義
usort($data,function($p1,$p2){return $p2->score-$p1->score;});
*/
/*
//単純ソートのアルゴリズム
for($i=0;$i<count($data)-1;$i++){
for($j=$i+1;$j<count($data);$j++){
if($data[$i]->score < $data[$j]->score){
$temp=$data[$i];
$data[$i]=$data[$j];
$data[$j]=$temp;
}
}
}
*/
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHPLesson</title>
</head>
<body>
<ol>
<?php for($i=0;$i<LIMIT;$i++):?>
<li><?=$data[$i]->toString()?></li>
<?php endfor;?>
</ol>
</body>
</html>
Q2.classを使って以下のような計算ドリルアプリを作成しよう。
1.実行すると10問足し算の問題が出題される(二桁の足し算)

2.値を入力してcheckボタンを押す。

3.結果が表示される。

4.もう1回ボタンを押すと新しい問題が出題される。

[ 解答例]
◯quiz.php
<?php
session_start();
class MathQuiz{
//クラス定数
const QUIZ_COUNT=10;
const MIN_NUMBER=1;
const MAX_NUMBER=99;
//クラスフィールド
public static $correctCount;
//フィールド
public $ques;
public $ans;
public $isCorrect;
//コンストラクタ
function __construct(){
$x=mt_rand(self::MIN_NUMBER,self::MAX_NUMBER);
$y=mt_rand(self::MIN_NUMBER,self::MAX_NUMBER);
$this->ques="{$x}+{$y}=";
$this->ans=$x+$y;
}
//メソッド
//入力された値をチェックして結果を出力する
function check($input){
if(ctype_digit($input)){
if((int)$input===$this->ans){
$this->isCorrect=true;
self::$correctCount++;
}
}else{
$input='';
}
return sprintf("%s %s%s %s",$this->isCorrect?'◯':'×',$this->ques,$input,$this->isCorrect?'':"({$this->ans})");
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHPLesson</title>
</head>
<body>
<?php if(count($_POST)>0):?>
<?php for($i=0;$i<MathQuiz::QUIZ_COUNT;$i++):?>
<p><?=$_SESSION['quiz'][$i]->check($_POST['ans'][$i]);?></p>
<?php endfor;?>
<p>全<?=MathQuiz::QUIZ_COUNT?>問中<?=MathQuiz::$correctCount?>問正解</p>
<button onclick="location.href=''">もう一回</button>
<?php else:?>
<?php
$_SESSION['quiz']=[];
for($i=0;$i<MathQuiz::QUIZ_COUNT;$i++){
$_SESSION['quiz'][]=new MathQuiz();
}
?>
<form method="post">
<?php for($i=0;$i<MathQuiz::QUIZ_COUNT;$i++):?>
<p><?=$_SESSION['quiz'][$i]->ques?><input type="number" name="ans[]"></p>
<?php endfor;?>
<button type="submit">check!</button>
</form>
<?php endif;?>
</body>
</html>

コメント