У меня восемь футбольных команд, которые играют 1х1 на четырех кортах каждые выходные.
Чего я хочу добиться, так это случайного определения кортов, но кортам не разрешается быть такими же, как в предыдущей игре для любой из команд.
У меня есть цикл foreach для каждого раунда, который содержит цикл foreach для каждой игры в этом раунде.
Проблема в том, что я назначаю корты случайным образом, и в последней игре раунда единственный оставшийся корт не всегда работает с указанными правилами. Поэтому мне нужно повторить цикл foreach для каждого матча в текущем раунде. Как я могу это сделать? Нужно ли подходить к этому по-другому?
Вот пример второго тура сезона:
Хозяева предыдущего суда: 1
Гости команд предыдущего суда: 2
Команды: 2 против 4
Суд: 3
Эти суды уже используются: 3,
Хозяева команд предыдущего двора: 3
Гости команд предыдущего суда: 1
Команды: 6 против 1
Суд: 2
Эти суды уже используются: 3, 2,
Хозяева предыдущих судов: 4
Гости команд предыдущего суда: 2
Команды: 8 против 3
Суд: 1
Эти суды уже используются: 3, 2, 1,
Хозяева предыдущих судов: 4
Выездные команды предыдущего суда: 3
Команды: 7 против 5
Суд: НЕТ ВОЗМОЖНЫХ АЛЬТЕРНАТИВ
Пример кода
$rounds = SQL FOR SELECTING ALL ROUNDS;
$teams = array();
$i = 0;
$prevround = '';
$reload = false;
foreach($rounds as $round) {
$roundid = $round->ROUND;
$matches = "SELECT * FROM TABLE WHERE ROUND = '$roundid'";
foreach($matches as $match) {
$i++;$round = $match->ROUND;
// If new round (could possibly be placed above foreach instead)
if($round != $prevround) {
echo "<h2>Round nr. ".$match->ROUND."</h2><br />";
$courtarray = array();
$prevround = $match->ROUND;
$clearcache = false;
$prevcourt = 0;
}$stop = false;
echo "These courts are already in use:";
foreach($courtarray as $bannummer) {
echo $bannummer.", ";
}
echo "<br>";
echo "The home teams previous court: ".$teams[$match->TEAM_HOME]."<br>";
echo "The away teams previous court:".$teams[$match->TEAM_AWAY]."<br>";
//for($j=1;$j<5;$j++) {
$k = 0;
back:
$j = rand(1,4);
//Check if the random number (1-4) can match the rules
if($j == $teams[$match->TEAM_HOME] or $j == $teams[$match->TEAM_AWAY] or in_array($j, $courtarray)) {
//Try this 10 times
$k++;
if($k > 10) {
$reload = true;
} else {
// Yes, i know this is not a nerdy way to do it :)
goto back;
}
} else if($stop != true) {
$court = $j;
$bcourtarray[] = $court;
$stop = true;
}
//}echo "<strong>Teams: ".$match->TEAM_HOME." - ".$match->TEAM_AWAY."<br />";
if($court == $prevcourt) {
echo "Court: NO POSSIBLE ALTERNATIVES</strong><br />";
$startover = true;
} else {
echo "Court: ".$court."</strong><br />";
}
// Used to save the different team´s previous court
$teams[$match->TEAM_HOME] = $court;
$teams[$match->TEAM_AWAY] = $court;
$prevcourt = $court;
}
}
Так что я думаю, мне нужно сделать
$matches = $db2->get_results("SELECT * FROM TABLE WHERE ROUND = '$roundid'");
foreach($matches as $match) {
запустить снова с текущим $ roundid; если сценарий не может найти последний суд для использования.
Или есть более разумное решение для этого? Должен ли я сделать функцию, которая вместо этого вызывает цикл? Могу ли я назвать это внутри себя?
Иногда вы застреваете в определенном образе мышления. 🙂
Я думаю, это то, что вы ищете. Нет необходимости в рекурсивной функции. Внизу вы можете найти ссылки на ссылки PHP для важных используемых функций.
То, что я делаю, это отслеживание судов, используемых на команду (в $usedCourts[__TEAM__]
) и посмотрите, есть ли суды ($courts
) которые не были заняты обеими командами, используя array_diff()
, Я выбираю первый доступный корт с помощью array_shift()
:
$numberOfCourts = 3;
$courts = range(1,$numberOfCourts);
$usedCourts = array();
foreach($matches as $match) {
if(!array_key_exists($match->TEAM_HOME, $usedCourts)) {
$usedCourts[$match->TEAM_HOME] = array();
}
if(!array_key_exists($match->TEAM_AWAY, $usedCourts)) {
$usedCourts[$match->TEAM_AWAY] = array();
}
$possibleCourts = array_diff($courts, $usedCourts[$match->TEAM_HOME], $usedCourts[$match->TEAM_AWAY]);
echo $match->TEAM_HOME . ' - ' . $match->TEAM_AWAY;
if(count($possibleCourts)) {
$currentCourt = array_shift($possibleCourts);
$usedCourts[$match->TEAM_HOME][] = $currentCourt;
$usedCourts[$match->TEAM_AWAY][] = $currentCourt;
echo ' on court: ' . $currentCourt;
} else {
echo ' has no available field';
}
echo "\n";
}
Других решений пока нет …