Разделить элементы массива на другой массив одинаково в случайном порядке Переполнение стека

Название в значительной степени говорит само за себя, поэтому я сразу перейду к проблеме.

Давайте предположим, что у меня есть массив таких элементов:

$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 шериф.)

2

Решение

Это работает, если количество участников меньше или равно ролям. Перемешайте массив ролей, чтобы рандомизировать его:

shuffle($classicRoles);

Затем в цикле удалите один из массива ролей и присвойте его новому массиву:

$pushArray['role'] = array_pop($classicRoles);

Вы не оговорили, что должно произойти, если у вас больше участников, чем ролей, но что-то вроде:

if(count($classicRoles) > 0) {
$pushArray['role'] = array_pop($classicRoles);
} else {
break;
}
1

Другие решения

Для каждого элемента массива ролей выберите случайного пользователя из массива users (array_rand ()) и удалите указанный ключ пользователя из доступного массива пользователей.

Это должно делать свое дело.

foreach($classicRoles as $role) {
$userKey = array_rand($participantAssoc);
$currentUser = $participantAssoc[$userKey];
$currentUser['role'] = $role;
$participantsArray[] =  $currentUser;
unset($participantAssoc[$userKey]);
}
0