2013-11-23 3 views
0

Я пытаюсь показать список дней недели, исключая воскресенье. Первый день в списке должен быть любым днем ​​и сегодня с классом CSS «active». Если сегодня = воскресенье, первым пунктом списка должен быть понедельник.Показать список дней недели, кроме воскресенья

Ниже приведен код, который я использую. Проблема в том, что это выводит первые 6 дней с сегодняшнего дня (включая воскресенье), а затем пропускает 7-й день с сегодняшнего дня.

Любая идея, что мне нужно изменить, чтобы вместо этого пропустить воскресенье?

function daysofweek() { 

$datetime = new \DateTime(); 

$listItem = array('<li class="active"><a href="#', '" data-toggle="tab">', '</a></li>'); 

$i = 0; 

echo '<ul class="nav nav-tabs">'; 

    while (true) { 
     if ($i === 6) break; 

     if ($datetime->format('N') === '7' && $i === 0) { 
      $datetime->add(new \DateInterval('P1D')); 
      continue;   
     } 

     $the_day = $datetime->format('D'); 

     echo $listItem[0] . $the_day . $listItem[1] . $the_day . $listItem[2]; 
     $listItem = array('<li><a href="#', '" data-toggle="tab">', '</a></li>');  

     $datetime->add(new \DateInterval('P1D')); 
     $i++; 
    } 

echo '</ul>'; 

}

ответ

2

Это плохой способ код

while(true) 

Это всегда истинен. Даже с вашим break это плохой синтаксис. Ваш while должен содержать логику. Итак, вот ваш код, реструктурированный. Я удалил дубликат вызова на add() и сделал его запущенным для каждой итерации. Цикл, естественно, тоже заканчивается.

$i = 0; 
while($i < 7) { 
    $the_day = $datetime->format('N'); 
    if($the_day != 7) { 
     echo $listItem[0] . $the_day . $listItem[1] . $the_day . $listItem[2]; 
     $listItem = array('<li><a href="#', '" data-toggle="tab">', '</a></li>');  
    } 
    $datetime->add(new \DateInterval('P1D')); 
    $i++; 
} 
+0

Большое спасибо за объяснение te - оно работает как шарм. – user1444027

0

Это то же самое в гораздо более краткого форматирование:

$today = date('w'); 
$first = 1; 
for($i=$today; $i<$today+7; $i++){ 
    if($i%7) echo "<li ".($first ? "class='active'" : '').">".date('D', strtotime("Sunday +".($i%7)." days"))."<li>"; 
    $first=0; 
} 

Он работает с помощью модуля %7 к циклу через неделю, начиная с сегодняшнего дня.

0

Я предпочитаю создавать функцию, которая возвращает массив, вместо того чтобы писать вывод внутри него. Здесь мои объяснения сначала:

  • Чтобы получить текущую дату, используйте функцию time.
  • Чтобы получить числовое представление текущего дня недели, используйте функцию date со значением 'w' в качестве первого аргумента. Он вернется 0 на воскресенье до 6 на субботу.
  • Чтобы получить следующую дату, добавьте текущую дату с помощью (24 * 60 * 60). Это будет 86 400 секунд или 1 день с текущего времени. Значение 24 для часа, первое 60 - это минута, а последняя 60 - вторая.
  • Чтобы получить имя текущего дня недели, используйте функцию date со значением 'l' (нижний регистр буквы L) в качестве первого аргумента.

Nuff сказал, вот функция:

function weekDaysFromToday() { 
    $days = array(); 
    $date = time(); 
    while (count($days) < 7) { 
    $date += (24 * 60 * 60); 
    if (!date('w', $date)) continue; 
    $days[] = date('l', $date); 
    } 
    return $days; 
} 

Если вы хотите, чтобы текущий день не повторяется в конце списка, вы должны изменить while (count($days) < 7) в while (count($days) < 6).

А вот код для отображения массива, используя код выше:

$days = weekDaysFromToday(); 
$active = ' class="active"'; 
echo "<ul class=\"nav nav-tabs\">\n"; 
foreach ($days as $day) { 
    echo "<li$active><a href=\"#$day\" data-toggle=\"tab\">$day</a></li>\n"; 
    $active = ''; 
} 
echo '</ul>'; 

Там вы, надеюсь, что это помогает.

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