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

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

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

$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;
}

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

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

foreach($classicRoles as $role) {
    $userKey = array_rand($participantAssoc);
    $currentUser = $participantAssoc[$userKey];
    $currentUser['role'] = $role;
    $participantsArray[] =  $currentUser;
    unset($participantAssoc[$userKey]);
}
Другие вопросы по тегам