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