Рассчитать наибольшее количество дней между двумя последовательными датами - PullRequest
1 голос
/ 29 ноября 2009

Если у вас есть массив дат ISO, как бы вы рассчитали наибольшее количество дней между двумя последовательными датами из массива?

$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');

Я думаю, что мне нужен цикл, какая-то итерационная переменная и что-то вроде. Я не могу понять это.

Это на самом деле вывод из MYSQL.

Ответы [ 3 ]

1 голос
/ 29 ноября 2009

Вот как вы можете сделать это в PHP:

<?php
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');

# PHP was throwing errors until I set this
# it may be unnecessary depending on where you
# are using your code:
date_default_timezone_set("GMT");

$max = 0;
if( count($array) > 1 ){
    for($i = 0; $i < count($array) - 1; $i++){
        $start = strtotime( $array[$i] );
        $end   = strtotime( $array[$i + 1] );

        $diff  = $end - $start;
        if($diff > $max) $max = $diff; 
    }
}

$max = $max / (60*60*24);

?>

Он зацикливает ваши предметы (выполняется на один раз меньше, чем количество предметов) и сравнивает каждый Если сравнение больше следующего, оно обновляет макс. Время указывается в секундах, поэтому после окончания цикла мы конвертируем секунды в дни.

1 голос
/ 29 ноября 2009

Этот скрипт PHP даст вам самый большой интервал

1) { для ($ i = 0; $ i $ maxinterval) $ maxinterval = $ days; } } ?>
1 голос
/ 29 ноября 2009

РЕДАКТИРОВАТЬ :
Как [изначально] сформулировано, вопрос можно понять [по крайней мере ;-)] двумя способами:

  • A) Массив содержитсписок дат в порядке возрастания.Задача состоит в том, чтобы найти самый длинный период (выраженный в количестве дней) между последовательными датами в массиве.
  • B) Массив не обязательно отсортирован.Задача состоит в том, чтобы найти самый длинный период (например, количество дней) между любыми двумя датами в массиве

Ниже приводится ответ на«Б» понимание вопроса.Ответ "A" см. В решении dcneiner


Сортировка не требуется! ...

Если это происходит из MySQL, возможно, эта СУБД возвращает значения MIN и MAX.значения для рассматриваемого списка.
РЕДАКТИРОВАТЬ: Как указано Darkerstar, способ структурирования данных [а также существующий запрос SQL, который возвращает полный список, как указано в вопросе], обычно определяют способ, который производит запросзначения MIN и MAX должны быть структурированы.
Может быть что-то вроде этого:

SELECT MIN(the_date_field), MAX(the_date_field)
FROM the_table
WHERE -- whatever where conditions if any
--Note: no GROUP BY needed

Если каким-то образом вы не можете использовать SQL, один проход по списку позволит вам получить MIN и MAXзначение в списке (за время O (n), то есть).
Алгоритм тривиален:
Установите минимальное и максимальное значения для первого элемента в списке [несортированные].
Выполните итерацию по каждому следующему элементу всписок, сравнивая его с минимальным значением и заменяя его, если он найден меньшим, и выполняя аналогичные действия для максимального значения ...

С минимальными и максимальными значениями в руке, простая разницадает максимальное количество дней ...
В PHP это выглядит следующим образом:

<?php
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');

# may need this as suggested by dcneiner
date_default_timezone_set("GMT");

$max = $array[0];
$min = $max;
for($i = 1; $i < count($array); $i++){
    // Note that since the strings in the array are in the format YYYY-MM-DD,
    // they can be compared as-is without requiring say strtotime conversion.
    if ($array[$i] < $min)
        $min = $array[$i];
    if ($array[$i] > $max)
        $max = $array[$i];
}
$day_count = (strtotime($max) - strtotime($min)) / (60*60*24);

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...