2013-04-21 4 views
2

Я пытаюсь выяснить, как исключить определенные даты из диапазона дат, который я настроил. Диапазон дат прекрасно работает следующим образом:php: исключить даты из диапазона дат

<?php $newBegin = new DateTime('6/30/2010'); 
$newEnd = new DateTime('7/12/2010'); 
$newEnd = $newEnd->modify('+1 day'); 

$newDaterange = new DatePeriod($newBegin, new DateInterval('P1D'), $newEnd); 

foreach($newDaterange as $newDate){ 
    echo $newDate->format("jnY") . " "; 
} ?> 

который печатает результаты как так:

3062010 172010 272010 372010 472010 572010 672010 772010 872010 972010 1072010 1172010 1272010 

Но клиент должен исключить определенные даты из каждого диапазона дат, так что я бы предпочтительно, чтобы как введите даты так: 7/2/2010 7/4/2010 8/4/2010 и исключите их из диапазона дат. Это вообще возможно? Я не хочу исключать выходные или такие, я могу это сделать, просто введите набор дат и исключите их из диапазона дат. Любые предложения будут ценны!


Update:

Как @ hek2mgl просили об этом, я добавил var_dump() из get_field('test_select'));

var_dump(get_field('test_select')); 

Результат:

array(2) { [0]=> string(8) "7/2/2010" [1]=> string(8) " 

Полный код (не w orking):

$newBegin = DateTime::createFromFormat('n/j/Y', '6/30/2010'); 
$newEnd = DateTime::createFromFormat('n/j/Y', '7/12/2010'); 
$newEnd = $newEnd->modify('+1 day'); 

$exclude = array(); 

// stores dates like so: 7/2/2010 7/3/2010 
foreach(get_field('test_select') as $datestring) { 
    $exclude []= new DateTime($datestring); 
} 

$newDaterange = new DatePeriod($newBegin, new DateInterval('P1D'), $newEnd); 

foreach($newDaterange as $newDate){ 
    if(!in_array($newDate, $exclude)) { 
     echo $newDate->format("jnY") . " "; 
    } 
} 
+1

один совет - не используйте потенциально двусмысленные форматы даты. '7/12/2010' может быть 12 июля вам, но для меня это означает 7 декабря. И будьте осторожны, что неоднозначный ввод может привести к тому, что PHP примет неправильное значение. Если возможно, всегда используйте недвусмысленный формат даты внутри вашего кода. Если это невозможно, используйте 'DateTime :: CreateFromFormat()', с явно указанным форматом. – Spudley

ответ

3

Там нет никакого способа, чтобы исключить несколько дат в пределах диапазона, используя DatePeriod класс. Но вы можете использовать in_array() вместе с объектами DateTime. Это может привести к коду, например:

$newBegin = new DateTime('6/30/2010'); 
$newEnd = new DateTime('7/12/2010'); 
$newEnd = $newEnd->modify('+1 day'); 

$exclude = array(
    new DateTime('7/2/2010'), 
    new DateTime('7/4/2010'), 
    new DateTime('8/4/2010') 
); 

$newDaterange = new DatePeriod($newBegin, new DateInterval('P1D'), $newEnd); 

foreach($newDaterange as $newDate){ 
    if(!in_array($newDate, $exclude)) { 
     echo $newDate->format("jnY") . " "; 
    } 
} 

Выход:

3062010 172010 372010 572010 672010 772010 872010 972010 1072010 1172010 1272010 

Update:

В комментариях вы просили, как перевести входящий список дат строк в DateTime объектов, которые могут использоваться в массиве $exclude.

Пример:

$exclude = array(); 

// stores dates like so: 7/2/2010 7/3/2010 
foreach(get_field('test_select') as $datestring) { 
    $exclude []= new DateTime::createFromFormat('n/j/Y', $datestring); 
} 

Вот так. :)

+0

большое вам спасибо! это почти идеально, есть только одна маленькая вещь, так как исключенные даты (в массиве) будут введены в интерфейсе пользователя, а не в конец, как в примере выше, возможно ли для нового DateTime ('7/2/2010 '), 'to_ get_field (' test_select ');' с датой, введенной пользователем в поле 'test_select'? – user1374796

+0

Если 'test_select' содержит строку parseble date by DateTime, используйте' new DateTime (get_field ('test_select')); ' – hek2mgl

+0

хороший, тот сработал! Я немного изменил его, последний вопрос, который я обещаю, поле 'test_select' теперь печатает массив дат. например'echo implode ('', get_field ('test_select'));' отображает такие даты: '7/2/2010 7/3/2010' можно ли исключить их из диапазона дат? Я все еще довольно новичок в php, поэтому я не уверен на 100%, как это будет написано ... – user1374796

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