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>