需求
一个拓展训练班,教练带队,要把成员按照性别随机分成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);
}