Название в значительной степени говорит само за себя, поэтому я сразу перейду к проблеме.
Давайте предположим, что у меня есть массив таких элементов:
$classicRoles = [
'mafia',
'mafia',
'don',
'civilian',
'civilian',
'civilian',
'civilian',
'civilian',
'civilian',
'sherif'
];
Теперь после выполнения запроса я получаю следующий массив
while ($participantAssoc = mysqli_fetch_assoc($participantsQuery)) {
$pushArray['room_id'] = $participantAssoc['room_id'];
$pushArray['participant_id'] = $participantAssoc['participant_id'];
$pushArray['id'] = $participantAssoc['id'];
$pushArray['role'] = $participantAssoc['role'];
$pushArray['eliminated'] = $participantAssoc['eliminated'];
array_push($participantsArray, $pushArray);
}
Здесь все хорошо, если я не попробую следующий пункт.
Я стараюсь дать каждому участнику роль: 2 роли мафии, 1 роль Дона, 6 гражданских лиц и 1 шериф.
Проблема в том, что я не могу заставить его работать вообще.
Таким образом, количество участников может варьироваться только для одного элемента, но давайте даже предположим, что количество участников и количество ролей полностью равны друг другу. Итак, пока, кто-нибудь может сказать мне, как я могу сделать вышеупомянутую логику в массивах PHP? (Дайте каждому участнику роль: 2 роли мафии, 1 роль Дона, 6 гражданских лиц и 1 шериф.)
Это работает, если количество участников меньше или равно ролям. Перемешайте массив ролей, чтобы рандомизировать его:
shuffle($classicRoles);
Затем в цикле удалите один из массива ролей и присвойте его новому массиву:
$pushArray['role'] = array_pop($classicRoles);
Вы не оговорили, что должно произойти, если у вас больше участников, чем ролей, но что-то вроде:
if(count($classicRoles) > 0) {
$pushArray['role'] = array_pop($classicRoles);
} else {
break;
}
Для каждого элемента массива ролей выберите случайного пользователя из массива users (array_rand ()) и удалите указанный ключ пользователя из доступного массива пользователей.
Это должно делать свое дело.
foreach($classicRoles as $role) {
$userKey = array_rand($participantAssoc);
$currentUser = $participantAssoc[$userKey];
$currentUser['role'] = $role;
$participantsArray[] = $currentUser;
unset($participantAssoc[$userKey]);
}