Генерация массива с использованием DateInterval и DatePeriod для смен

Я использую DateInterval и DatePeriod для создания изменений в медицинском приложении

$begin = new DateTime('2012-08-01 08:00');
$end = new DateTime('2012-08-01 12:00');
$interval = new DateInterval('PT45M');
$daterange = new DatePeriod($begin, $interval ,$end);

Эти функции позволяют мне генерировать следующий массив

Array
(
    [0] => 08:00
    [1] => 08:45
    [2] => 09:30
    [3] => 10:15
    [4] => 11:00
    [5] => 11:45
)

Какие функции и как я могу сделать так, чтобы окончательный массив был завершен и разделен на части?

Array
(
    [0] => Array
        (
            [0] => 08:00
            [1] => 08:45
        )

    [1] => Array
        (
            [0] => 08:45
            [1] => 09:30
        )

    [2] => Array
        (
            [0] => 09:30
            [1] => 10:15
        )

    [3] => Array
        (
            [0] => 10:15
            [1] => 11:00
        )

    [4] => Array
        (
            [0] => 11:00
            [1] => 11:45
        )
)

Спасибо

2 ответа

Решение
$previous = null;
$dates    = array();
foreach ($period as $dt) {
    $current = $dt->format("H:i");
    if (!empty($previous)) {
        $show = new DateTime($current);
        $dates[] = array($previous, $show->format('H:i'));
    }
    $previous = $current;
}

После получения вашего массива, используя DateTime функция. Просто подключи и играй с кодом.:)

$retrieveArray = array('08:00','08:45','09:30','10:15','11:00','11:45'); // Sample Array, Assumed mentioned in Question.

$final = array();
for ($i=0; $i < count($retrieveArray)-1; $i++) { 
    $j = $i+1;
    $final[$i] = array($retrieveArray[$i], $retrieveArray[$j]);
}

использование var_dump($final); проверить результат массива.

Желаемый вывод

Array
(
    [0] => Array
        (
            [0] => 08:00
            [1] => 08:45
        )

    [1] => Array
        (
            [0] => 08:45
            [1] => 09:30
        )

    [2] => Array
        (
            [0] => 09:30
            [1] => 10:15
        )

    [3] => Array
        (
            [0] => 10:15
            [1] => 11:00
        )

    [4] => Array
        (
            [0] => 11:00
            [1] => 11:45
        )

)

Редактировать:

Добавить последнюю смену

@ Джон прав. Он пропускает последнее граничное значение, если оно точно соответствует длине интервала. По мере необходимости предлагаю ДОБАВИТЬ +1 min до вашего последнего времени. Это настройка / исправление, но цель сервера.

$begin = new DateTime('2012-08-01 08:00');
$end = new DateTime('2012-08-01 10:00');
$end = $end->modify( '+1 minute' ); // Tweak, to add last shift value.
$interval = new DateInterval('PT30M');
$daterange = new DatePeriod($begin, $interval ,$end);

Чтобы проверить вывод

foreach ( $daterange as $dt ){
    echo '<pre>';
    echo $dt->format( "H:i" );
    echo '</pre>';
}

Он включает в себя последнее граничное значение, если оно точно соответствует длине интервала.

Другие вопросы по тегам