// 定义一个全局变量,存储分数数组集合
private $ans = [];
// 完成主要业务
public function test(){
// 取出分数
$data=DB::table('test')->whereNotNull('score')->get()->toArray();
$data = array_column($data,'score');
// 获取考试设置
$total_grade = 100;
$exam_number = 35;
// 排列分数组合
sort($data);
// 递归+回溯获取所有分数满足指定分数的数组集合
$this->backtrack($data,$total_grade,0,[]);
$list = collect($this->ans);
}
// 采用collcet集合方法random(),从集合中返回一个随机项
$score_combination = collect($combination)->random();
// 根据随机的这个数组去题库中随机抽题;ps:这个抽出来的题题目有重复的
$random_data = ExamQuestionBank::whereIn('score',$score_combination)->inRandomOrder()->get()->toArray();
$return_data = [];
$del = [];
// 统计这个组合有多少个
$combination_count = count($score_combination);
// 对题库中抽出来的题进行去重,并且抽取相应数量
foreach ($random_data as $key=>$val){
foreach ($score_combination as $k => $v){
// 如果题库中的分数等于分数组合中的分数,并且这个题库id还不在del数组中
if ($val['score'] == $v && !in_array($key,$del)){
// 返回的数据添加上这个value
$return_data[] = $val;
// 销毁分数数组中的这个分数
unset($score_combination[$k]);
// 将已经返回的id添加到del数组中,确保下次筛选不会有重复的数据
$del[] = $key;
}
}
// 如果返回的数据数量等于分数组合的数量,那么就跳出循环,把抽题后的数据返回回去
if (count($return_data) == $combination_count){
break;
}
return $return_data;
}
// 递归加回溯找出所有分数组合
public function backtrack($candidates,$target,$start,$list){
if($target < 0){
$this->create([],'总分小于0!',201);
}else if($target == 0){
$this->ans[] = $list;
}else{
for($i=$start;$i<count($candidates) && ($target-$candidates[$i])>=0;$i++){
if($i>$start && $candidates[$i] == $candidates[$i-1]){
continue;
}
array_push($list,$candidates[$i]);
$this->backtrack($candidates,$target-$candidates[$i],$i+1,$list);
array_pop($list);
}
}
}
06-24
181
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交