我有一个将用户分配到不同大小的组的功能。此功能必须逐个填充组,直到达到每组的最大大小。 它考虑了想要与另一个用户在一个群组中的用户的请求。 问题出在哪里:当用户只提出一个请求时,一切都运行良好。但是当这个用户是许多请求的一部分时,该功能并没有做我想要的。
这是我的代码:
我为每个组创建一个多维数组,其中包含组对象,最大大小和添加到组中的用户计数器。
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);
}
有我的问题。我需要考虑作为请求或请求用户的多个请求中的用户。对于每个请求,添加相同组中涉及的所有用户,相应地更新计数器。