php 根据每个类型的抽签范围实现抽签功能

一:前言

小组:第一组,第二组,第三组,第四组,第五组,第六组,第七组,第八组,第九组,第十组

教室:第一教室,第二教室,第三教室,第四教室,第五教室,第六教室,第七教室,第八教室,第九教室,第十教室

抽签条件:

第一组抽签范围:第二教室,第三教室,第四教室

第二组抽签范围:第三教室,第四教室,第五教室

第三组抽签范围:第七教室,第八教室,第九教室,第十教室

第四组抽签范围:第七教室,第八教室

第五组抽签范围:第三教室,第四教室,第五教室,第六教室

第六组抽签范围:第二教室,第三教室,第四教室,第五教室,第六教室,第七教室,第八教室

第七组抽签范围:第二教室,第三教室,第四教室

第八组抽签范围:第一教室,第二教室,第三教室

第九组抽签范围:第四教室,第五教室,第六教室

第十组抽签范围:第八教室,第九教室,第十教室

二:实现

小组编号分别为:XZ1,ZA2,ZA3,ZA4,ZA5,ZA6,ZA27,ZA8,ZA9,ZA10

教室编号分别为:JS1,JS2,JS3,JS4,JS5,JS6,JS7,JS8,JS9,JS10

复制代码
/**
     * 抽签处理
     * @param $data array 抽签范围数据
     * 结构:
     * ```
     * [
     *      '抽签KEY1' => ['抽签范围1', '抽签范围2'],
     *      '抽签KEY2' => ['抽签范围1', '抽签范围2']
     * ]
     * ```
     * @param $keys array 抽签KEY数组
     * 结构:
     * ```
     * [
     *      '抽签KEY1',
     *      '抽签KEY2'
     * ]
     * ```
     * @param $index integer 抽签的抽签KEY下标
     * @param $result array 抽签结果
     * @param $used array 抽签范围已被使用的记录
     * @return bool 是否抽签成功
     */
    public static function track($data, $keys, $index, &$result, &$used)
    {
        // 全部取完,成功
        if ($index >= count($keys)) {
            return true;
        }
        $key = $keys[$index];
        $subArr = $data[$key];
        shuffle($subArr);
        foreach ($subArr as $value) {
            // 如果值未被使用
            if (!in_array($value, $used)) {
                $used[] = $value;
                $result[$key] = $value;

                if (self::trackRoomGroup($data, $keys, $index + 1, $result, $used)) {
                    return true;
                }
                // 回溯
                array_pop($used);
                unset($result[$key]);
            }
        }
        // 当前子数组所有值都无法满足要求
        return false;
    }

调用抽签方法:

复制代码
 $data = [
    'XZ1' => ['jS2','jS3','jS4'],
    'XZ2' => ['jS3','jS4','jS5'],
    'XZ3' => ['jS7','jS8','jS9','jS10'],
    'XZ4' => ['jS7','jS8'],
    'XZ5' => ['jS3','jS4','jS5','jS6'],
    'XZ6' => ['jS2','jS3','jS4','jS5','jS6','jS7','jS8'],
    'XZ7' => ['jS2','jS3','jS4'],
    'XZ8' => ['jS1','jS2','jS3'],
    'XZ9' => ['jS5','jS6','jS7'],
    'XZ10' => ['jS8','jS9','jS10'],
];
$result = [];
$used = [];
$keys = array_keys($data);
$status = self::trackRoomGroup($data, $keys, 0, $result, $used);
if ($status) {
    //抽签成功
    return $result;
} else {
    //抽签失败
    return false;
}

调用上述方法可实现抽签功能 抽签结果返回如下

复制代码
array(10) {
  ['XZ1']=>
  string('JS4')
  ['XZ2']=>
  string('JS5')
  ['XZ3']=>
  string('JS9')
  ['XZ4']=>
  string('JS7')
  ['XZ5']=>
  string('JS3')
  ['XZ6']=>
  string('JS8')
  ['XZ7']=>
  string('JS2')
  ['XZ8']=>
  string('JS1')
  ['XZ9']=>
  string('JS6')
  ['XZ10']=>
  string('JS10')
}
相关推荐
qq_4069810315 小时前
大白话rust系列08 当变量遮蔽遇上引用,探究变量遮蔽的本质
开发语言·后端·rust
喵了几个咪16 小时前
GoWind ShortPlay 拆解:不用模型的推荐闭环——埋点回流、三路召回与已看去重
开发语言·后端·微服务·golang·gowind
谙弆悕博士16 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室
Canmag 兴隆磁性16 小时前
回复磁导率 μ_R:永磁体在动态磁路中的关键参数
开发语言·学习·r语言·永磁材料·充磁·磁导率
CRMEB系统商城16 小时前
鲜花零售的预售与积分营销
开发语言·人工智能·科技·小程序·零售
Wang's Blog16 小时前
Java 项目实战: 交友项目 - 喜欢与取消喜欢
java·开发语言·交友
quantdash_cc17 小时前
如何检查滚动收益率计算中的窗口长度不足?——从数学定义到 Pandas 实现
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
Flynt17 小时前
PHP 9.2 分 RCE 的补丁比公告早公开 3 天,我读完 389 个文件的 diff,也把"死在代码之前"跑了出来
安全·php·源码
衍生星球17 小时前
【Java 语言】— 方法(方法定义、调用、参数、返回值、方法重载)
java·开发语言·方法
CodeGL17 小时前
16、Python Web开发
开发语言·前端·python