2009-09-14 3 views
1

Мне нужно написать код на PHP, который выполняет действие только в чередующиеся недели, в зависимости от дня недели (mon, tue и т. Д.), А не числа (1-го, 7-го и т. Д.).PHP, чередование недельной логики

Итак, в цикле, начинающемся в понедельник, он должен работать в течение одной недели, а не на следующей неделе.

Я уверен, что это должно быть проще, чем я думаю, но, похоже, не работает, так что помогите пожалуйста!

+0

Что вы получили до сих пор? –

ответ

7

Вы могли бы просто взять номер недели, а также выполнять свои действия, когда это странно, если день понедельник, например (или даже!):

$time=time(); 
$dayNo=strftime('%u', $time); #1=monday 
$weekNo=strftime('%U', $time); #week number 

if (($dayNo==1) && ($weekNo%2)) 
{ 
    #do something on mondays, alternating weeks 
} 
+2

Могу ли я прокомментировать, что побитовые сравнения часто намного быстрее, чем деление, даже если вы используете оператор разделения модуля. Для сильных двух сравнений используйте и каждый раз. – scragar

+1

+1 - Вам нужно будет выяснить, является ли первый номер недели первым или нечетным первым и соответствующим образом скорректирован, но это должно быть очень простым (попробуйте добавить номера первой недели вхождения с номером текущей недели вместе перед выполнением '% 2'). –

+3

Вы ждете, пока операция модуля не станет узким местом, прежде чем беспокоиться об этом! Использование модуля улучшает связь, а также позволяет легко запускать каждую третью, четвертую, пятую неделю или что-то еще ... –

0

Что-то иметь в виду, что strtotime() Функция очень надежная и может дать вам нечеткую информацию, такую ​​как the second Sunday in March ("Second Sunday March 0").

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

<?php 
$month = time(); 

// Calculate the first day of the month contained in the $month timestamp 
$first_day = strtotime(
    date(
     'Y-m-1 00:00:00', 
     $month 
    ) 
); 

// Calculate the sunday opening the week that contains the first day 
// of the month (e.g. August 30th, 2009 is the Sunday that corresponds 
// to September 1st, 2009) 
$pseudo_first_sunday = strtotime(
    'First Sunday', 
    strtotime(
     '-1 Week', 
     $first_day 
    ) 
); 

var_dump(date('Y-m-d', strtotime('Second Week', $pseudo_first_sunday))); 

Вывод этого сценария будет (по состоянию на 2009-9-14):

string(10) "2009-09-06" 

Какая вторая неделя сентября (но не вторая ПОЛНАЯ неделя, если вы хотите, чтобы это заменило $first_day in для $pseudo_first_sunday).

Просто что-то иметь в виду при игре с датами в PHP.

1

Хотя Paul Dixon прибил его, если вы после одного лайнера, вы могли бы просто сделать ...

if(date('W') % 2) { 
// Will only execute on alternate weeks. 

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