Deelnemers verdelen over groepen van 3 na inschrijving
Deelnemers aan een competitie ronde hebben zich ingeschreven. Maar de deelnemers moeten random in groepen van 3 geplaatst worden, zodra de inschrijving gesloten is. En bij een bepaald aantal deelnemers moeten er ook groepen van 2 gemaakt worden, want een deelnemer kan niet alleen meedoen?
Hoe ga ik dit aanpakken?
$a % $b Modulo Remainder of $a divided by $b.
https://www.php.net/manual/en/language.operators.arithmetic.php
#1 indien het totaal aantal deelnemers deelbaar is door 3 (rest na deling gelijk aan 0) dan kunnen alle groepen uit drie deelnemers bestaan
#2 indien de rest na deling gelijk is aan 2 dan zal er 1 groep zijn met 2 deelnemers
#3 indien de rest na deling gelijk is aan 1 dan zul je 1 groep met 3 deelnemers moeten "kannibaliseren" om hier twee groepen van 2 van te maken
En dan heb je nog mogelijk het randgeval waarbij er te weinig deelnemers zijn. Als er minder dan 4 deelnemers zijn dan is er niet zoveel competitie :).
EDIT: en daarmee garandeer je tevens dat je genoeg mensen hebt voor gevalsonderscheid #3 ((ten minste) twee groepen van twee)
Gewijzigd op 12/11/2019 17:24:09 door Thomas van den Heuvel
Ik heb een oplossing gevonden. Op basis van het aantal inschrijvingen worden er nu eerst 2 of 3 deelnemers random uit de database gehaald en daar wordt een groep-nummer aan gegeven. Daarna worden er weer 3 random uit de database gehaald van de deelnemers die nog geen groep-nummer hebben. Enz enz tot dat ze allemaal een groep-nummer hebben.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
// debugging
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
// hulpfuncties
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
function dump($in) {
if (is_array($in)) {
$in = print_r($in, true);
}
echo '<pre>'.escape($in).'</pre>';
}
// deelnemers
$participants = array(
'Henk', // 1 persoon: te weinig deelnemers
'Piet', // 2 personen: te weinig deelnemers
'Klaas', // 3 personen: te weinig deelnemers
'Marie', // 4 personen: twee groepen van 2
'Eva', // 5 personen: een groep van 2
'Hanneke', // 6 personen: twee groepen van 3
'Jan', // 7 personen: 2 groep(en) van 2
// 'Theo', // 8 personen: 1 groep(en) van 2
// 'Jaap', // 9 personen: 3 groepen van 3
// et cetera
);
// initiele check
if (count($participants) < 4) {
echo '[error] te weinig deelnemers';
exit;
}
// random volgorde
shuffle($participants);
// deel op in groepen van ten hoogste 3
$groups = array_chunk($participants, 3);
// indien laatste groep 2 personen heeft: dit werk heeft array_chunk al gedaan, de "rest" zit in de laatste groep
// indien laatste groep 1 persoon heeft
if (count($participants) % 3 === 1) {
// selecteer willekeurige groep van 3 deelnemers
$groupNumber = rand(0, count($groups) - 2); // van en met 0 tot en zonder de laatste groep, -2 omdat je nummert vanaf 0
// hussel deze groep opnieuw (niet per se nodig)
// shuffle($groups[$groupNumber]);
// pak laatste deelnemer
$participant = array_pop($groups[$groupNumber]);
// en voeg deze toe aan laatste groep
$groups[count($groups)-1][] = $participant; // -1 omdat je nummert vanaf 0
}
// controle
dump($participants);
dump($groups);
?>[end]
// debugging
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
// hulpfuncties
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
function dump($in) {
if (is_array($in)) {
$in = print_r($in, true);
}
echo '<pre>'.escape($in).'</pre>';
}
// deelnemers
$participants = array(
'Henk', // 1 persoon: te weinig deelnemers
'Piet', // 2 personen: te weinig deelnemers
'Klaas', // 3 personen: te weinig deelnemers
'Marie', // 4 personen: twee groepen van 2
'Eva', // 5 personen: een groep van 2
'Hanneke', // 6 personen: twee groepen van 3
'Jan', // 7 personen: 2 groep(en) van 2
// 'Theo', // 8 personen: 1 groep(en) van 2
// 'Jaap', // 9 personen: 3 groepen van 3
// et cetera
);
// initiele check
if (count($participants) < 4) {
echo '[error] te weinig deelnemers';
exit;
}
// random volgorde
shuffle($participants);
// deel op in groepen van ten hoogste 3
$groups = array_chunk($participants, 3);
// indien laatste groep 2 personen heeft: dit werk heeft array_chunk al gedaan, de "rest" zit in de laatste groep
// indien laatste groep 1 persoon heeft
if (count($participants) % 3 === 1) {
// selecteer willekeurige groep van 3 deelnemers
$groupNumber = rand(0, count($groups) - 2); // van en met 0 tot en zonder de laatste groep, -2 omdat je nummert vanaf 0
// hussel deze groep opnieuw (niet per se nodig)
// shuffle($groups[$groupNumber]);
// pak laatste deelnemer
$participant = array_pop($groups[$groupNumber]);
// en voeg deze toe aan laatste groep
$groups[count($groups)-1][] = $participant; // -1 omdat je nummert vanaf 0
}
// controle
dump($participants);
dump($groups);
?>[end]
Van de deelnemers die een groep-nummer hebben gekregen wordt dit direct in de database weggeschreven. Daarna volgt er een nieuwe random ronde onder de deelnemers die nog geen groep-nummer hebben. En in mijn geval moeten de kleine groepen de eersten zijn. Die zijn immers sneller met z'n 2en dan een groep van 3 personen.
Quote:
Van de deelnemers die een groep-nummer hebben gekregen wordt dit direct in de database weggeschreven. Daarna volgt er een nieuwe random ronde onder de deelnemers die nog geen groep-nummer hebben.
Laat hier eens wat code van zien? Volgens mij doe je hier heel veel onnodige controles en voer je onnodige queries uit.
Quote:
En in mijn geval moeten de kleine groepen de eersten zijn.
Dit is nieuwe informatie. Waarom is dit nodig? En waarom had je dat dan niet in je oorspronkelijke vraagstuk gezet? Is dit niet gewoon een kunstgreep om te garanderen dat jouw code werkt?
Quote:
Die zijn immers sneller met z'n 2en dan een groep van 3 personen.
Geen idee wat dit inhoudt.
Voor mijn oplossing heb je één query nodig voor het opvragen van de deelnemers, en een aantal queries voor het wegschrijven van groepen. Meer heb je volgens mij niet nodig.
Ik vraag mij af wat het nut van het plaatsen van je vraag is als je mensen aan het (denk)werk zet en vervolgens je eigen plan trekt?
Het is geen kunst greep. Het betreft hier een indeling voor een golf wedstrijd. Als je dan niet alle groepen in 3 personen kunt verdelen, is het handiger dat de kleine groepen voorop lopen. Die worden anders opgehouden door een groep met meer mensen.
Ik wist niet dat je na het plaatsen van je vraag achterover moest gaan zitten en zelf enig eigen initiatief achterwege moest laten.
Quote:
Ik wist niet dat je na het plaatsen van je vraag achterover moest gaan zitten en zelf enig eigen initiatief achterwege moest laten.
Waarom vraag je dan in je oorspronkelijke bericht om een aanpak? Daarmee geef je de indruk dat je geen idee hebt waar je moet beginnen, en dan kun je ook verwachten dat mensen aanzetten aanleveren.
Vervolgens vertel je doodleuk dat je een oplossing hebt voor een probleem dat mogelijk totaal niet lijkt op hetgeen je vroeg.
Eigen initiatief is prima, maar toon dit dan voordat je andere mensen aan het werk zet voor een ogenschijnlijk compleet ongerelateerd vraagstuk.