大乐透与分页边界处理
一. 大乐透的实战
一)选球代码
<?php
// 大乐透球类
define('RED_BALLS', range(1, 35));
define('BLUE_BALLS', range(1, 12));
class DoubleColorBall
{
// 红球
private static $redBalls = RED_BALLS;
// 蓝球
private static $blueBalls = BLUE_BALLS;
// 红球中奖号: 5/35
private static $electRedBalls = [];
// 蓝球中奖号: 2/12
private static $electBlueBalls = [];
// 保存试机号
public static $testNos = [];
// 从33个红球中取出5个红球
private static function createRedBalls()
{
// 1. 35选5
for ($i = 0; $i < 5; $i++) {
// 1. 随机取1个,返回一个key
$key = array_rand(self::$redBalls);
// 2. 将这个球添加到红球数组中
array_push(self::$electRedBalls, self::$redBalls[$key]);
// 3. 将选出的红球从原始的33个红球中删除,剩下的再次随机抽取
array_splice(self::$redBalls, $key, 1);
}
// 2. 排序输出
sort(self::$electRedBalls, SORT_NUMERIC);
}
// 从12个蓝球中取出2个蓝球
private static function createBlueBall()
{ // 1. 35选5
for ($i = 0; $i < 2; $i++) {
// 1. 随机取1个,返回一个key
$key = array_rand(self::$blueBalls);
// 2. 将这个球添加到球数组中
array_push(self::$electBlueBalls, self::$blueBalls[$key]);
// 3. 将选出的红球从原始的12个红球中删除,剩下的再次随机抽取
array_splice(self::$blueBalls, $key, 1);
}
// 2. 排序输出
sort(self::$electBlueBalls, SORT_NUMERIC);
}
// 生成试机号
private static function createTestNos($n = 5)
{
for ($i = 0; $i < $n; $i++) {
self::$redBalls = RED_BALLS;
self::$blueBalls = BLUE_BALLS;
self::$electRedBalls = [];
self::$electBlueBalls = [];
// 生成红球
self::createRedBalls();
// 生成蓝球
self::createBlueBall();
// 红蓝球合并生成一个中奖试机号
self::$testNos[] = array_merge(self::$electRedBalls, self::$electBlueBalls);
}
}
// 获取试机号,供外部调用(外部只需要访问它,也就是只有它是公开的)
public static function getTestNos($n = 5)
{self::createTestNos($n);
return self::$testNos;
}
}
二)展示html代码
<?php
require __DIR__ . '/Lotto.php';
// 生成数量应该从当前URL中获取
// $n = isset($_GET['n']) ? $_GET['n'] : 5;
// null合并运算符
$n = $_GET['n'] ?? 5;
// print_r($n);
$allBalls=DoubleColorBall::getTestNos($n);
// print_r(DoubleColorBall::$testNos);
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>生成大乐透中奖试机号</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="lottery">
<h2>大乐透试机号</h2>
<form>
<input type="number" name="n" min="1" value="<?=$_GET['n'] ?? 5?>" onchange="isVip(this)">
<button>生成试机号</button>
</form> <table><tbody>
<?php foreach ($allBalls as $key=> $balls): ?>
<tr>
<!-- 第一列是序号: 默认从1开始 $key+1 -->
<td><?=$key+1?></td>
<?php foreach ($balls as $ball) : ?>
<td><?=$ball?></td>
<?php endforeach; ?>
</tr>
<?php endforeach ?>
</tbody>
</table>
<p>福利彩票大家买,众手托起幸福来</p>
</div>
<script>
function isVip(input) {
if (input.value > 10) {
alert('免费用户只能看10个,看更多升级到VIP,现在升级8折');
input.value = 10;
input.max = 10;
location.reload(true);
return false;
}
}
</script>
</body>
</html>
三)做好的效果图
二. 为分页添加”上一页”,”下一页”功能,边界处理
一)边界处理的关键代码
<p>
<?php
//上一页的小于0的判断
$pages1 = ($page - 1 > 0) ? ($page - 1) : 1;
$pages2 = $_SERVER['PHP_SELF'] . '?page='.$pages1;
?>
//
<a href="<?= $pages2 ?>">上一页</a>
//
<?php for ($i = 1; $i <= $pages; $i++) : ?>
<?php $url = $_SERVER['PHP_SELF'] . '?page='. $i;
$style = 'style="background:red"';
// $i 是当前的页码, $_GET['page']相同时才是要高亮的页码
$active = ($i == @$_GET['page']) ? $style : null;
?> <a href="<?= $url ?>" <?= $active ?>><?= $i ?></a> <?php endfor ?>
//
<!-- 下一页的超出页码的判断 -->
<?php
$pages3=($page + 1 < $pages)?($page + 1):$pages;
$pages4 = $_SERVER['PHP_SELF'] . '?page=' .$pages3;
?>
<a href="<?= $pages4 ?>">下一页</a></p>
二)处理后的效果图