Поле свободно:
- Между играми.
- Между
opening time of the pitch
и start of the first game
.
- Между
end of the last game
и closing time of the pitch
.
Если вы будете хранить игры в массиве вместо переменных, вы можете просто определить время для вышеупомянутых случаев - если применимо - с помощью цикла по массиву.
Что-то в этом роде может работать:
<?php
$pitchOpeningTimes =
[
'pitchStart' => '2018-06-11 08:00 AM',
'pitchClose' => '2018-06-11 09:00 PM'
];
$games = [
[
'GameStart' => '2018-06-11 09:30 AM',
'GameEnd' => '2018-06-11 10:00 AM',
],
[
'GameStart' => '2018-06-11 10:00 AM',
'GameEnd' => '2018-06-11 10:30 AM',
],
[
'GameStart' => '2018-06-11 11:00 AM',
'GameEnd' => '2018-06-11 11:30 AM',
]
]; // Assuming these are sorted ascending, if this assumption is wrong, sort it.
function openSlots($openingTimes, $plannedGames)
{
if (count($plannedGames) == 0) { # No games planned, pitch is free all day.
return ['freeSlotStart' => $openingTimes['pitchStart'], 'freeSlotEnd' => $openingTimes['pitchClose']];
}
$freeslots = []; # We need a result array to push our free slots to.
// First edge case: pitch might be free between pitchStart and start of the first game
// if game doesn't start at opening of the pitch.
if ($plannedGames[0]['GameStart'] !== $openingTimes['pitchStart']) {
$freeslots[] = [
'freeSlotStart' => $openingTimes['pitchStart'],
'freeSlotEnd' => $plannedGames[0]['GameStart']
];
}
// Loop over the games to check for open slots between games.
for ($g = 0; $g < count($plannedGames) - 1; $g++) {
if ($plannedGames[$g]['GameEnd'] !== $plannedGames[$g + 1]['GameStart']) {
// echo $g;
$freeslots[] = [
'freeSlotStart' => $plannedGames[$g]['GameEnd'],
'freeSlotEnd' => $plannedGames[$g + 1]['GameStart']
];
}
}
// Second edge case: pitch might be free between pitchEnd and end of the last game
// If game doesn't end at the time the pitch closes.
$lastGame = end($plannedGames);
if ($lastGame['GameEnd'] !== $openingTimes['pitchClose']) {
$freeslots[] = [
'freeSlotStart' => $lastGame['GameEnd'],
'freeSlotEnd' => $openingTimes['pitchClose']
];
}
return $freeslots;
}
var_dump(openSlots($pitchOpeningTimes, $games));
Примечание:
- Сравнение даты и времени как строк (вероятно) не является наилучшей практикой.
- Код выше не очень элегантный.
- Я не тестировал этот код для вывода желаемых результатов. По крайней мере, это должен быть хороший намек в правильном направлении.
Edit:
После того, как ваш ваш код не работает комментарий, мне потребовалось около 10 секунд моего времени, чтобы:
- Добавьте
echo $g;
в цикл for.
- Обратите внимание, что цикл for не выполняется.
- Обратите внимание на тот факт, что инкремент и условное число были поменяны местами.
Мой код работал, в том смысле, как я говорил, что это была просто попытка подтолкнуть вас в правильном направлении. Я твердо чувствую, что это было не мое время, а ваше, которое было потрачено на это быстрое решение. Во всяком случае, достаточно с тирадой, я изменил: for ($g = 0; $g++; $g < count($plannedGames) - 1)
на for ($g = 0; $g < count($plannedGames) - 1; $g++)
. Надеюсь, это поможет.