一:前言
小组:第一组,第二组,第三组,第四组,第五组,第六组,第七组,第八组,第九组,第十组
教室:第一教室,第二教室,第三教室,第四教室,第五教室,第六教室,第七教室,第八教室,第九教室,第十教室
抽签条件:
第一组抽签范围:第二教室,第三教室,第四教室
第二组抽签范围:第三教室,第四教室,第五教室
第三组抽签范围:第七教室,第八教室,第九教室,第十教室
第四组抽签范围:第七教室,第八教室
第五组抽签范围:第三教室,第四教室,第五教室,第六教室
第六组抽签范围:第二教室,第三教室,第四教室,第五教室,第六教室,第七教室,第八教室
第七组抽签范围:第二教室,第三教室,第四教室
第八组抽签范围:第一教室,第二教室,第三教室
第九组抽签范围:第四教室,第五教室,第六教室
第十组抽签范围:第八教室,第九教室,第十教室
二:实现
小组编号分别为: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')
}