Om de meest optimale combinatie te vinden, zouden we eerst alle combinaties moeten samenstellen en nadien aflopen welke mogelijk zijn.
Om alle combinaties te berekenen hebben we gebruik gemaakt van onderstaande functie:
public function combinations($arrays, $i = 0) {
if (!isset($arrays[$i])) {
return [];
}
if ($i == count($arrays) - 1) {
return $arrays[$i];
}
// get combinations from subsequent arrays
$tmp = $this->combinations($arrays, $i + 1);
$result = [];
// concat each array from tmp with each element from $arrays[$i]
foreach ($arrays[$i] as $k => $v) {
foreach ($tmp as $x => $t) {
$result[] = is_array($t) ?
array_merge([$v], $t) :
[$v, $t];
}
}
return $result;
}
Daarna bekijken we per combinatie of deze combinatie mogelijk is met het aantal beschikbare plaatsen voor een bepaald slot.
De eerste combinatie die we tegenkomen en waarvan alle plaatsen beschikbaar zijn, markeren we als $finalCombination.
foreach ($combinations as $combination) {
// Check if available
$combinationOk = true;
foreach ($slotsAvailability as $slot => $amount) {
$arrayCountValues = array_count_values($combination);
if (isset($arrayCountValues[$slot]) && $arrayCountValues[$slot] > $amount) {
$combinationOk = false;
break;
}
}
if ($combinationOk) {
$finalCombination = $combination;
break;
}
}
Deze oplossing is perfect doenbaar voor kleine toewijzingsmatrices.
Wanneer we naar een matrix gaan met meer studenten, merken we al snel dat deze oplossing tegen zijn limieten zit en bij ongeveer 15 studenten al out of memory gaat.
Er zijn dan twee manieren om dit op te lossen, het PHP proces meer geheugen geven of kijken naar een andere oplossing, zoals het Hongaars algoritme.