一個關於排隊的問題

需求

一個拓展訓練班,教練帶隊,要把成員按照性別隨機分成5組,最好保證男女比例儘量平均。

程序流程

教練在後臺添加一個隊伍,id爲1;指定隊伍有5個分組,groups=5。
學員來到報名頁,選擇該教練的的隊伍,提交數據到程序。

表結構

存儲隊伍成員的表
在這裏插入圖片描述

代碼

$userinfo = ['team_id'=>1,'sex'=>1,'uid'=>1,'groups'=>5];
add_user($userinfo);
function add_user($userinfo){
		$user_list  = Db::name('team_user')->where(['team_id'=>$userinfo['team_id']])->select();
		//如果隊伍人數小於隊伍的分組數,直接把用戶信息插入到下一個分組中
		if(empty($user_list) || count($user_list)<$userinfo['groups']){
			if(empty($user_list)){
				$team_num = 1;
			}else{
				$team_num = count($user_list)+1;
			}
			$data = [
					'uid'	=> $userinfo['uid'],
					'team_num' => $team_num,
					'sex'	=> $userinfo['sex'],
					'team_id' => $userinfo['team_id'],
				];
			Db::name('team_user')->insert($data);
			return true;
		}else{
			//如果隊伍人數已經大於隊伍分組數
			//把隊員按小組號分組,然後把分組按照人數順序排列。遍歷5個小組,判斷小組是否缺少當前用戶,需要,插入,結束循環

			//分組
			$team_arr = [];
			foreach($user_list as $v){
				if(!isset($team_arr[$v['team_num']])){
					$team_arr[$v['team_num']] = [
						'user_num' => 1,
						'boys'  => $v['sex']==1?1:0,
						'girls'	=> $v['sex']==2?1:0
					];
				}else{
					$team_arr[$v['team_num']]['user_num'] += 1;
					if($v['sex'] == 1){
						$team_arr[$v['team_num']]['boys'] += 1;
					}elseif($v['sex'] == 2){
						$team_arr[$v['team_num']]['girls'] += 1;
					}
				}
				$team_arr[$v['team_num']]['team_num'] = $v['team_num'];
			}
		}
		//判斷各個小組需要男生還是女生
		foreach($team_arr as $k=>$v){
			//男生人數大於女生人數,需要女生
			if($v['boys'] > $v['girls']){
				$need_sex = 2;
				$need = 1;
			//男生人數小於女生人數,需要男生
			}elseif($v['girls'] > $v['boys']){
				$need_sex = 1;
				$need = 1;
			}else{
				$need_sex = 0;
				$need = 0;
			}
			$team_arr[$k]['need_sex'] = $need_sex;
			$team_arr[$k]['need'] = $need;
		}
		//按人數 順序排序
		//人數若相等,再按是否需要新成員 排序,不需要新成員的小組排在下面
		$user_num_sort = array_column($team_arr,'user_num');
		$need_sort = array_column($team_arr,'need');
		array_multisort($user_num_sort,SORT_ASC,$need_sort,SORT_DESC,$team_arr);
		print_r($team_arr);exit;
		//插入用戶
		$data = [
					'uid'	=> $userinfo['uid'],
					'sex'	=> $userinfo['sex'],
					'team_id' =>  $userinfo['team_id'],
				];
		foreach($team_arr as $v){
			if($userinfo['sex'] == $v['need_sex']){
				$data['team_num'] = $v['team_num'];
				Db::name('team_user')->insert($data);
				return true;
			}
		}
		//運行到這一步,說明該用戶的性別,所有小組都不需要,那插入到排在第一位(即人數最少)的小組
		$data['team_num'] = $team_arr[0]['team_num'];
		Db::name('team_user')->insert($data);
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章