Нужно свободное время от общего времени - PullRequest
0 голосов
/ 05 июля 2018

Существует один шаг, и шаг имеет свое собственное время начала и окончания (например, от 8:00 AM до 7:00 PM). И несколько матчей уже были запланированы на поле с некоторым временем. (например, от 8:30AM до 9:00AM, 10:00 AM до 10:30 AM) Итак, теперь я хочу рассчитать доступное время на поле. Мой код здесь:

$pitchStart = '2018-06-11 08:00 AM';
$pitchClose = '2018-06-11 09:00 PM';

$firstGameStart = '2018-06-11 09:30 AM';
$firstGameEnd = '2018-06-11 10:00 AM';

$secondGameStart = '2018-06-11 10:00 AM';
$secondGameEnd = '2018-06-11 10:30 AM';

$thirdGameStart = '2018-06-11 11:00 AM';
$thirdGameEnd = '2018-06-11 11:30 AM';


$Result = [
    [0] => ['freeSlotStart' => '2018-06-11 08:00 AM','freeSlotEnd' => '2018-06-11 09:30 AM'],
    [1] => ['freeSlotStart' => '2018-06-11 10:30 AM','freeSlotEnd' => '2018-06-11 11:00 AM'],
    [2] => ['freeSlotStart' => '2018-06-11 11:30 AM','freeSlotEnd' => '2018-06-11 09:00 PM'],
];

1 Ответ

0 голосов
/ 05 июля 2018

Поле свободно:

  1. Между играми.
  2. Между opening time of the pitch и start of the first game.
  3. Между 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));

Примечание:

  1. Сравнение даты и времени как строк (вероятно) не является наилучшей практикой.
  2. Код выше не очень элегантный.
  3. Я не тестировал этот код для вывода желаемых результатов. По крайней мере, это должен быть хороший намек в правильном направлении.

Edit:

После того, как ваш ваш код не работает комментарий, мне потребовалось около 10 секунд моего времени, чтобы:

  1. Добавьте echo $g; в цикл for.
  2. Обратите внимание, что цикл for не выполняется.
  3. Обратите внимание на тот факт, что инкремент и условное число были поменяны местами.

Мой код работал, в том смысле, как я говорил, что это была просто попытка подтолкнуть вас в правильном направлении. Я твердо чувствую, что это было не мое время, а ваше, которое было потрачено на это быстрое решение. Во всяком случае, достаточно с тирадой, я изменил: for ($g = 0; $g++; $g < count($plannedGames) - 1) на for ($g = 0; $g < count($plannedGames) - 1; $g++). Надеюсь, это поможет.

...