phpな休日 BBS sitemap
1. 抽選

ネットでのプレゼント応募が多いですね。かくゆう私もよく作成します、応募フォーム。
正しくは 「作成させられます」 ですが。
で、応募期限が終了すると抽選になるわけです。
ハガキでの応募ならかき混ぜて1枚抜き取れば終わりなのでが、フォームからの応募の場合、そーゆーわけにもいかないので
「皆さんどうされているんでしょうね、抽選」。
そんなことで、ここはひとつ [抽選機スクリプト] を作ってみます。

<?php
$number = rand(1,10); //最小と最大の間の乱数(整数)を返します
print "当選番号は" . $number . "¥n";
?>

rand は引数 min と max の間(両端を含む)の整数を返します。

実行

これでめでたく公正で厳正な抽選が可能になりましたが、応募数によりいちいちスクリプトを書きかえるのもいただけないので、 min と max の値をフォームから送信するようにしてみます。

2. minno ~ maxno の間で抽選

フォームから最小番号と最大番号を送信して、その間で抽選するようにします。

<?php
if ((isset($_POST["minno"])) && (isset($_POST["maxno"]))) { //POSTされてきた場合
$minno = $_POST["minno"];
$maxno = $_POST["maxno"];
$number = rand($minno,$maxno); //当選番号を決める
}
if (isset($number)) {
print "当選番号は" . $number;
}
else {
?>
<form method="POST" action="">
<input type="text" name="minno" size="5"> ~ <input type="text" name="maxno" size="5"> の間で抽選 <input type="submit" value="送信">
</form>
<?php
}
?>

実行
3. 当選が複数の場合

当選が複数の場合は当選数分繰り返せばよいのですが、それも10回・20回となると面倒なので一回の抽選で複数の当選番号を出力できるようにします。
「shuffle すれば良いよね」 とマニュアルを見にいったらまんまのサンプルがあったので、ほぼコピペで済みました。

<?php
if ((isset($_POST["minno"])) && (isset($_POST["maxno"])) && (isset($_POST["num"]))) { //POSTされてきた場合
$minno = $_POST["minno"];
$maxno = $_POST["maxno"];
$num = $_POST["num"];
print "当選番号は<br>¥n";
$arra = 0; //配列番号初期化
$numbers = range($minno, $maxno);
srand((float)microtime() * 1000000);
shuffle($numbers);
foreach ($numbers as $number) {
if ($arra == $num) {break;}
print $number . "<br>¥n";
$arra++; //配列番号を足す
}
}
else {
?>
<form method="POST" action="">
<input type="text" name="minno" size="5"> ~ <input type="text" name="maxno" size="5"> の間で <input type="text" name="num" size="5"> つ抽選 <input type="submit" value="送信">
</form>
<?php
}
?>

実行
4. 当選番号をソートして表示

番号順に表示したほうが見やすいのでソートしてから表示してみます。

<?php
if ((isset($_POST["minno"])) && (isset($_POST["maxno"])) && (isset($_POST["num"]))) { //POSTされてきた場合
$minno = $_POST["minno"];
$maxno = $_POST["maxno"];
$num = $_POST["num"];
print "当選番号は<br>¥n";
$numbers = range($minno, $maxno);
srand((float)microtime() * 1000000);
shuffle($numbers);
for ($i = 0; $i < $num; $i++) { //$numの数だけ回す
$ele[$i] = $numbers[$i]; //当選番号を配列に入れる
}
sort($ele); //ソート
reset($ele);
for ($i = 0; $i < $num; $i++) {
print $ele[$i] . "<br>¥n";
}
}
else {
?>
<form method="POST" action="">
<input type="text" name="minno" size="5"> ~ <input type="text" name="maxno" size="5"> の間で <input type="text" name="num" size="5"> つ抽選 <input type="submit" value="送信">
</form>
<?php
}
?>

実行

Fatal error: Uncaught Error: Undefined constant "Y.n.j" in /home/users/2/secret.jp-final/web/phpholiday/36/index.cgi:138 Stack trace: #0 /home/users/2/secret.jp-final/web/phpholiday/index.php(334): include() #1 {main} thrown in /home/users/2/secret.jp-final/web/phpholiday/36/index.cgi on line 138