From fb3d8c238685dbeb2d3d6d0ca865469eda53caa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E6=B8=85?= <18691022700@163.com> Date: Mon, 15 Sep 2025 22:51:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=A4=E5=8F=8B=E4=B8=AD=E6=9B=B4=E6=8D=A2?= =?UTF-8?q?=E9=BA=A6=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/api/model/Friend.php | 59 ++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/application/api/model/Friend.php b/application/api/model/Friend.php index 857e367..966dea8 100644 --- a/application/api/model/Friend.php +++ b/application/api/model/Friend.php @@ -414,7 +414,7 @@ class Friend extends Model $usedUsers = []; // 优先选择高价值且无重复用户的对 $heart_ids = []; - foreach ($originalPairs as $rel) { + foreach ($originalPairs as &$rel) { // 检查当前用户对是否包含已使用的用户ID if (!in_array($rel['user1_id'], $usedUsers) && !in_array($rel['user2_id'], $usedUsers)) { @@ -441,10 +441,12 @@ class Friend extends Model ->limit($make_up_num) ->order('heart_value DESC')->select(); foreach ($ranking_make_up as $rel1) { - $heart_ids[] = $rel1['id']; + // 如果两个用户都已使用,跳过这条记录 if(in_array($rel1['user1_id'], $usedUsers) && in_array($rel1['user2_id'], $usedUsers)){ continue; } + + // 如果只有user1已使用,将user2加入排名 if(in_array($rel1['user1_id'], $usedUsers)){ $ranking1[] = [ 'heart_value' => 0, @@ -453,8 +455,10 @@ class Friend extends Model 'user2_id' => $rel1['user2_id'], ]; $usedUsers[] = $rel1['user2_id']; + $heart_ids[] = $rel1['id']; } - if(in_array($rel1['user2_id'], $usedUsers)){ + // 如果只有user2已使用,将user1加入排名 + elseif(in_array($rel1['user2_id'], $usedUsers)){ $ranking1[] = [ 'heart_value' => 0, 'id' => $rel1['id'], @@ -462,8 +466,10 @@ class Friend extends Model 'user2_id' => -1, ]; $usedUsers[] = $rel1['user1_id']; + $heart_ids[] = $rel1['id']; } } + } // 返回最终的排名列表 $ranking_rut = array_merge($ranking, $ranking1); @@ -476,7 +482,6 @@ class Friend extends Model ->order('heart_value DESC')->select(); if($ranking_make_up){ foreach ($ranking_make_up as $rel1) { - $heart_ids[] = $rel1['id']; if(in_array($rel1['user1_id'], $usedUsers) && in_array($rel1['user2_id'], $usedUsers)){ continue; } @@ -529,39 +534,45 @@ class Friend extends Model $pit_unique = []; $key = 0; foreach($heart_data as $value) { - //这条数据有一个用户已经排过了,就剔除这条数据 if(count($pit) >= 6){ break; } + // 处理两个用户都存在的情况 if($value['user1_id'] != -1 && $value['user2_id'] != -1){ if(!in_array($value['user1_id'],$pit_unique)){ - $pit[$pit_number_array_reverse[$key]] = $value['user1_id']; - $pit[$pit_number_array[$pit_number_array_reverse[$key]]] = $value['user2_id']; + // 检查目标麦位是否已被占用 + if(!isset($pit[$pit_number_array_reverse[$key]])) { + $pit[$pit_number_array_reverse[$key]] = $value['user1_id']; + $pit[$pit_number_array[$pit_number_array_reverse[$key]]] = $value['user2_id']; + $pit_unique = array_merge($pit_unique, [$value['user1_id'], $value['user2_id']]); + } } } - - if($value['user1_id'] == -1){ - if(!in_array($value['user2_id'],$pit_unique)){ + // 处理只有user2存在的情况 + elseif($value['user1_id'] == -1 && !in_array($value['user2_id'],$pit_unique)){ + // 检查该键是否已被使用 + if(!isset($pit[$pit_number_array_reverse[$key]])) { $pit[$pit_number_array_reverse[$key]] = $value['user2_id']; + $pit_unique[] = $value['user2_id']; } } - - if($value['user2_id'] == -1){ - if(!in_array($value['user1_id'],$pit_unique)){ + // 处理只有user1存在的情况 + elseif($value['user2_id'] == -1 && !in_array($value['user1_id'],$pit_unique)){ + // 检查该键是否已被使用 + if(!isset($pit[$pit_number_array_reverse[$key]])) { $pit[$pit_number_array_reverse[$key]] = $value['user1_id']; + $pit_unique[] = $value['user1_id']; } } - - //用户去重 - $pit_unique[] = $value['user1_id']; - $pit_unique[] = $value['user2_id']; $key++; } } - return array_flip($pit); + return $pit; } + + //换麦 public function changePitToPosPairs($room_id,$friendPlayPit){ $now_pit_u = array_flip($friendPlayPit); @@ -682,13 +693,17 @@ class Friend extends Model //换麦 public function changePitToPosPair($room_id,$friendPlayPit){ - $new_pit_u = array_flip($friendPlayPit); + $new_pit_u = $friendPlayPit; //按照键值排序数组 ksort($new_pit_u); - //查询现在麦位上有用户的数据 并且重组结果,键为麦位,值为用户,值必须存在,没值则不展示 - $pit_user = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number'=>['<',7],'user_id' => ['>', 0]]) + //查询原有麦位上有用户的数据 并且重组结果,键为麦位,值为用户,值必须存在,没值则不展示 + $pit_users = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number'=>['<',7],'user_id' => ['>', 0]]) ->order('pit_number ASC') - ->column('pit_number,user_id'); + ->field('pit_number,user_id')->select(); + $pit_user = []; + foreach ($pit_users as &$value_pit_user){ + $pit_user[$value_pit_user['pit_number']] = $value_pit_user['user_id']; + } //比较两个数组,无论是键的差异还是值的差异,都输出字符串”有差异“否则输出”没有差异“ $result = array_diff_assoc($pit_user, $new_pit_u);//第一个数组中存在但其他数组中不存在的键/值对 $result2 = array_diff_assoc($new_pit_u, $pit_user);