Мне нужно вывести список дат (только по понедельникам и вторникам) на следующие 12 месяцев с текущей даты, например:
Январь 2010
Вт 12 янв 2010
Пн 18 Янв 2010
Вт 19 янв 2010
Пн 25 Янв 2010
Февраль 2010 г.
Вт 02 фев 2010
Пн 08 фев 2010
Вт 09 фев 2010
Пн 15 фев 2010
Вт 16 фев 2010
Пн 22 фев 2010
Март 2010 г.
Вт 09 мар 2010
Пн 15 мар 2010
Вт 16 мар 2010
...
Будучи новичком в PHP, я подумал, strtotime и циклы в течение следующих 52 недель - лучший путь.
$blockedDatesInput = "08 Mar 2010,12 Apr 2010"; // dont show these dates
$blockedDates = explode ("," , $blockedDatesInput); // convert to array
$currentMonth = ""; // current month marker
// loop over the next 52 weeks to find Mondays and Tuesdays
for($i=0; $i<=52; $i++){
// build the month header
$monthReference = date("M Y", strtotime('+'.$i.' Week'));
// check if date exists in $blockeddate
if (!in_array(date("d M Y", strtotime('+'.$i.' Monday')), $blockedDates) ||
!in_array(date("d M Y", strtotime('+'.$i.' Tuesday')), $blockedDates) ) {
// check if we have to show a new month
if(strcmp($monthReference, $currentMonth) <> 0){
echo $monthReference.'<br />',"\n";
}else{
// output the dates
echo date("D d M Y", strtotime('+'.$i.' Monday')).'<br />',"\n";
echo date("D d M Y", strtotime('+'.$i.' Tuesday')).'<br />',"\n";
}
$currentMonth = date("M Y", strtotime('+'.$i.' Week'));
}
}
Однако вывод из моего кода
Январь 2010
Пн 18 Янв 2010
Вт 12 янв 2010
Пн 25 Янв 2010
Вт 19 янв 2010
Февраль 2010 г.
Пн 08 фев 2010
Вт 02 фев 2010
Пн 15 фев 2010
Вт 09 фев 2010
Пн 22 фев 2010
Вт 16 фев 2010
Март 2010 г.
Пн 08 мар 2010
Вт 02 мар 2010
Пн 15 мар 2010
Вт 09 мар 2010
Пн 22 мар 2010
Вт 16 мар 2010
Пн 29 мар 2010
Вт 23 марта 2010 г.
Как видите, даты не в правильном порядке, и я в растерянности, потому что здесь я ошибаюсь.
Есть ли более элегантный / простой способ решить эту проблему?
Используемая версия PHP - 5.2.11, и в ближайшее время нет перспективы перехода на 5.3: - (
Спасибо за вашу помощь.
Код ниже модификации, как предложено Али.
Дата компьютера изменена с вт, 12.01.2010, на среду, 13.01.2010, чтобы проверить вывод.
$blockedDatesInput = "08 Mar 2010,12 Apr 2010"; // dont show these dates
$blockedDates = explode ("," , $blockedDatesInput); // convert to array
$currentMonth = ""; // current month marker
// loop over the next 52 weeks to find Mondays and Tuesdays
for($i=0; $i<=52; $i++){
// build the month header
$monthReference = date("M Y", strtotime('+'.$i.' Week'));
// check if date exists in $blockeddate
if (!in_array(date("d M Y", strtotime('+'.$i.' Monday')), $blockedDates) ||
!in_array(date("d M Y", strtotime('+'.$i.' Tuesday')), $blockedDates) ) {
// check if we have to show a new month
if(strcmp($monthReference, $currentMonth) <> 0){
echo $monthReference.'<br />',"\n";
}else{
// output the dates (changed the order as suggested by Aly)
echo date("D d M Y", strtotime('+'.$i.' Tuesday')).'<br />',"\n";
echo date("D d M Y", strtotime('+'.$i.' Monday')).'<br />',"\n";
}
$currentMonth = date("M Y", strtotime('+'.$i.' Week'));
}
}
Вывод снова в неправильном порядке.
Январь 2010
Вт 19 янв 2010
Пн 18 Янв 2010
Вт 26 янв 2010
Пн 25 Янв 2010
Февраль 2010 г.
Вт 09 фев 2010
Пн 08 фев 2010
Вт 16 фев 2010
Пн 15 фев 2010
Вт 23 фев 2010
Пн 22 фев 2010