2012-05-19 6 views
2

У меня есть массив объектов. Каждый объект включает значение даты.PHP: Фильтровать массив по дате

Что лучше всего фильтрует массив в соответствии с определенным диапазоном дат, где диапазон указан как startDate & endDate?


Update:

Спасибо за ваши ответы, я использовал этот код в конце:

foreach ($myArray as $key => &$value) 
{ 
     $d = DateTime::createFromFormat(self::DATE_FORMAT, $value["orderDate"]); 
     if ($d->getTimestamp() < $startDateTime->getTimestamp() || $d->getTimestamp() > $endDateTime->getTimestamp()) 
     { 
      unset($myArray[$key]); 
     } 
} 
+0

Если случайно, эти объекты из базы данных, вы также можете изменить свой SQL-запрос, чтобы вернуть результаты, уже отсортированные по дате. Вы должны использовать ключевые слова 'ORDER BY'. – Lix

ответ

3

Это является основной идеей; вам придется настроить его для определенного типа объекта и типа даты.

foreach ($myarray as $item) 
    if ($item->dateitem >= $startDate && 
     $item->dateitem <= $endDate) 
      $newarray[] = $item; 
2
function inRange($thingy) { 
    return $thingy->theDate >= $startDate && $thingy->theDate < $endDate; 
} 

$filtered = array_filter($unfiltered, "inRange"); 
3

Если предположить, что объект содержит строковое представление даты, мы будем конвертировать его в цифровой временной метки с помощью strtotime().

Чтобы отфильтровать все не в заданном диапазоне (сохраняет значения, соответствующие начальной/конечной величины):

$rangeStart = strtotime('-1 year'); 
$rangeEnd = strtotime('yesterday'); 

array_filter($array, function($var) use ($rangeStart, $rangeEnd) { 
    $utime = strtotime($var->date); 
    return $utime <= $rangeEnd && $utime >= $rangeStart; 
}); 

Для сортировки массива по дате:

function cmp($a, $b) { 
    $aTime = strtotime($a->date); 
    $bTime = strtotime($b->date); 

    if($aTime === $bTime) { return 0; } 
    else { return $aTime < $bTime? -1 : 1; } 
} 

usort($array, 'cmp'); 
+0

Ответы на другой вопрос. – Amadan

+1

Ha! Я получил половину пути ответа на вопрос и забыл, что я отвечаю. Так что вы тоже получите. Угадай, я пойду приготовить чай :) – Kato

Смежные вопросы