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

У меня есть функция для распределения пользователей по группам разных размеров. Эта функция должна заполнять группы по одной, пока не будет достигнут максимальный размер каждой группы.
Он учитывает запросы пользователей, которые хотят быть в группе с другим пользователем.
Вот в чем проблема: когда пользователь делает только один запрос, все работает хорошо. Но когда этот пользователь участвует во многих запросах, функция не делает то, что я хочу.

Вот мой код:

Я создаю многомерный массив для каждой группы с групповым объектом, максимальным размером и счетчиком пользователей, добавленных в группу.

foreach ($groupes as $groupe) {
$groupesOfCompo[] = ['objet' => $groupe,
'max' => $groupe->getNombre(),
'nombre' => 0];
}

Я получаю все запросы, когда пользователь просит быть с другим пользователем, и я добавляю пользователя, делающего запрос, в группу:

foreach ($demandes as $demande) {
// Get groups where the user can be
$groupes = $this->getAvailableGroupesForTutoresWithDemandes($dateDemande, $groupesOfCompo, $demande, $semestre);

// Add tutore to group where the max size is not reached and where the counter of users is minimal
if ($groupes) {
$groupesOfCompo = $this->addTutoreToGroupOfMaxRemainingSpace($groupesOfCompo, $groupes, $demande->getTutoreSource());
}
}

private function addTutoreToGroupOfMaxRemainingSpace($groupesOfCompo, $groupes, $tutore1, $tutore2 = null) {

// Get an array of groups counters
$effectifs = array_column($groupes, 'nombre');
// Get min counter
$min = min($effectifs);
// Get group of min counter
$min_array = $groupes[array_search($min, $effectifs)];

// Set group of source user to group of min counter
$tutore1->setGroupeComposition($min_array['objet']);
$this->em->persist($tutore1);

// if there's a requested user in the request, set group of this user to the same group
if ($tutore2) {
$tutore2->setGroupeComposition($min_array['objet']);
$this->em->persist($tutore2);
}

// In the initial array, find the group with min counter and increase the counter of 1 if there's not a requested user and of 2 if there's a requested user
foreach ($groupesOfCompo as &$a) {
if ($a['objet'] === $min_array['objet']) {
if ($tutore2) {
$a['nombre'] += 2;
}
else {
$a['nombre']++;
}
}
}

return $groupesOfCompo;
}

Затем я добавляю запрашиваемого пользователя в ту же группу, что и запрашивающий пользователь:

foreach ($demandes as $demande) {
$tutore2 = $demande->getTutoreDemande();
$tutore2->setGroupeComposition($demande->getTutoreSource()->getGroupeComposition());
$this->em->persist($tutore2);
}

Есть моя проблема. Мне нужно учитывать пользователей, которые находятся в нескольких запросах, как запрашивающий или запрошенный пользователь. И для каждого из этих запросов добавьте всех пользователей, участвующих в одних и тех же группах, соответственно обновляя счетчики.

0

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector