Учитывая список событий за день, как бы я посчитал вместо этого промежутки между этими событиями? - PullRequest
0 голосов
/ 23 марта 2012

В моем приложении у меня есть массив событий, поступающих из базы данных, каждое из которых имеет start_time и finish_time.В текущей версии приложения я рисую их на холсте, где каждое событие представляет собой <div> с определенным стилем.

Однако теперь мне нужно сделать то же самое, но вместо этого только отображать времякогда пользователь свободен (т.е. когда нет событий).Каков наилучший способ получить массив с блоками свободного времени с start_time и finish_time в отличие от событий?

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Тот же базовый принцип, что и в ответе Цукера, но вместо того, чтобы полагаться на непрерывный массив с использованием переменной «предыдущее состояние».

<?php
$result = array();

// *
$end = '00:00:00';     
foreach( getData() as $d ) {
    if ( $d['start_time']!=$end ) {
        $result[] = array('name'=>'available', 'start_time'=>$end, 'finish_time'=>$d['start_time'] );
    }
    $end = $d['finish_time'];       
    $result[] = $d;
}
// *
$result[] = array('name'=>'available', 'start_time'=>$end, 'finish_time'=>'23:59:59' );

print_r($result);



function getData() {
    return array(
        array(
            'name'=>'event A',
            'start_time'=>'01:45:00',
            'finish_time'=>'02:30:15'
        ),
        array(
            'name'=>'event B',
            'start_time'=>'02:30:15',
            'finish_time'=>'03:00:00'
        ),
        array(
            'name'=>'event C',
            'start_time'=>'03:15:00',
            'finish_time'=>'06:15:00'
        ),
    );
}

печать

Array
(
    [0] => Array
        (
            [name] => available
            [start_time] => 00:00:00
            [finish_time] => 01:45:00
        )

    [1] => Array
        (
            [name] => event A
            [start_time] => 01:45:00
            [finish_time] => 02:30:15
        )

    [2] => Array
        (
            [name] => event B
            [start_time] => 02:30:15
            [finish_time] => 03:00:00
        )

    [3] => Array
        (
            [name] => available
            [start_time] => 03:00:00
            [finish_time] => 03:15:00
        )

    [4] => Array
        (
            [name] => event C
            [start_time] => 03:15:00
            [finish_time] => 06:15:00
        )

    [5] => Array
        (
            [name] => available
            [start_time] => 06:15:00
            [finish_time] => 23:59:59
        )

)

(*) это не распространяется на события, которые начинаются в предыдущий день и заканчиваются в текущий день или начинаются в текущий день и заканчиваются на следующий день. Ради краткости я пропустил часть даты, но эти «крайние случаи» должны быть тривиальными.

1 голос
/ 23 марта 2012

Предполагая, что $ events отсортировал ASC по start_time, и недопустимых событий с start_time> end_time также нет, события не пересекаются во времени.

$events = array(
array('start_time', 'finish_time'),
array('start_time', 'finish_time'),
...
);

foreach($events as $key => $event) {
  if(isset($events[$key+1]))
   $free_time[] = array(
    'start_time' => $event['finish_time'],
    'end_time' => $events[$key+1]['start_time']
  );
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...