2012-02-21 7 views
0

Вам нужна помощь здесь. Я почти закончил, но застрял в том, как отфильтровать даты в прошлом. Например, я не хочу, чтобы даты со вчерашнего дня отображались как отпионы. Ниже приведен мой код.Отфильтровать даты, которые уже прошли

<select name="choose_date" id="choose_date"> 
<?php 
    if (isset($datesavailable) && is_array($datesavailable)) 
    { 
     foreach($datesavailable as $val) 
     { 
     rsort($val); 
     echo' <option value="'.$val.'">'.$val.'</option>\n'; 
     } 
    } 
    ?> 
    </select> 

Спасибо за ваше время заранее.

+2

какой формат являются даты в? – Cfreak

+1

Пожалуйста, напишите 'var_dump ($ dateavailable)' –

+1

неправильное место для фильтрации. как вы генерируете даты в первую очередь? – Gordon

ответ

1

Сравните временную метку unix «сегодняшней» даты и заданной даты ... (формат, который вы используете для своих дат, не должен быть критическим, поскольку strtotime будет анализировать строку, содержащую формат даты на английском языке, и попытается проанализировать это формат в метку времени Unix)

$date = "2004-02-29"; 
$unix_date = strtotime ($date); 

if ($unix_date < time()) 
{ 
    echo "date is before"; 
} 
else 
{ 
    echo "date is after"; 
} 
0

Как Гордон указывает, вы должны удалить нежелательные даты при построении datesavailable, но вы можете сделать это здесь или раньше с чем-то же просто, как:

if (strtotime($val) < strtotime('today')) { 
    continue; 
} 

вы может быть более конкретным, b ut strtotime может не работать в зависимости от ваших дат.

+0

Я думаю, что вы близко, но, похоже, не исправить. полный код здесь [ссылка] http://pastebin.com/8C7T6dcw В верхней части страницы есть ajax. – user1223745

1

Самый простой способ - преобразовать даты в временную метку unix и сравнить ее с time() или аналогичной функцией (зависит от часового пояса и т. Д.). Также вы можете попробовать использовать strtotime, но это довольно синтаксис. Представьте себе, что у вас есть правильный синтаксис (что-то вроде Y-m-d H:i):

foreach ($datesavailable as $val) { 
    if (!(strtotime($val) < time())) 
    echo ' <option value="'.$val.'">'.$val.'</option>\n'; 
} 

Кроме того, я не могу понять, почему там rsort($val);? rsort - функция обратного сортирования массива, почему вы пытаетесь сортировать строку?

И, наконец, вы должны рассмотреть возможность фильтрации данных намного до выхода, например. при выборе данных.

+0

вот ссылка на полный код на pastebin.com [ссылка] http://pastebin.com/8C7T6dcw [ссылка] – user1223745

+0

Это ничего не меняет, я уже опубликовал свой ответ :) – YuS

+0

ОК, спасибо, но он не работал. – user1223745

1

Если у вас есть PHP 5.3 вы можете использовать класс DatePeriod генерировать свободные даты, вы хотите включить только в следующем месяце:

$today = new DateTime(); 
$lastDay = clone $today; 
$lastDay->add(new DateInterval("P1M1D")); 
$period = new DatePeriod($today, new DateInterval("P1D"), $lastDay); 

foreach ($period as $day) 
{ 
    $formatted = $day->format('Y-m-d'); 
    print "<option value=\"{$formatted}\">{$formatted}</option>\n"; 
} 

Вы должны установить часовой пояс по умолчанию с date_default_timezone_set ()

1

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

С учетом новой информации, почему бы не фильтровать старые даты уже после получения дат из базы данных? Запрос будет таким:

SELECT * FROM wp_location_date WHERE location=$id and location_date >= CUR_DATE() ORDER BY location_date 

и, судя по использованию rsort() функции, которые вы хотите доступные даты в обратном порядке, так что запрос может исправить это немедленно, добавив DESC после заказа по, например:

SELECT * FROM wp_location_date WHERE location=$id and location_date >= CUR_DATE() ORDER BY location_date DESC 

Если вы все еще должны сделать это в PHP, вы можете выбирать даты, как это:

// Have this first line outside the foreach(), no need to set it multiple times. 
$today = strtotime(date('Y-m-d')); 
$valDate = strtotime($val); 

if ($valDate >= $today) 
{ 
    echo ' <option value="'.$val.'">'.$val.'</option>\n'; 
}