Повторяйте вложенный цикл, если результат не тот, который я хотел

У меня восемь футбольных команд, которые играют 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; если сценарий не может найти последний суд для использования.

Или есть более разумное решение для этого? Должен ли я сделать функцию, которая вместо этого вызывает цикл? Могу ли я назвать это внутри себя?

Иногда вы застреваете в определенном образе мышления. 🙂

0

Решение

Я думаю, это то, что вы ищете. Нет необходимости в рекурсивной функции. Внизу вы можете найти ссылки на ссылки 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";
}
0

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

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

По вопросам рекламы [email protected]