Сопоставить названия недель с днями недели в PHP - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь сделать календарь с HTML, CSS и PHP.И пока все прошло хорошо.Но в конце я обнаружил, что забыл, что месяцы не всегда начинаются в понедельник.

image

Как бы я это сделал?Я не так силен в PHP, и не могу понять, как бы я это сделал.

В этом месяце, например (декабрь) , мне нужно добавить 5 "скрытых или отключенных"дней вперед, чтобы соответствовать этому 1 декабря - суббота.

<!-- Week Days -->
<ul class="weekdays">
    <li>Monday</li>
    <li>Tuesday</li>
    <li>Wednesday</li>
    <li>Thursday</li>
    <li>Friday</li>
    <li>Saturday</li>
    <li>Sunday</li>
</ul>
<!-- Days -->
<ul class="days"> 
<?php

    // Make List
    $list = array();
    $month = date('m', strtotime('-1 month'));
    $year = date('Y', strtotime('-1 year'));

    for($d = 1; $d <= 31; $d++){
        $time = mktime(12, 0, 0, $month, $d, $year);    

        if(date('m', $time) == $month)       
            $list[] = date('d', $time);
    }
    if(is_array($list) || is_object($list)){
        foreach($list as $day){

            if($day < date('d')){
                echo '<li class="passed"><span>' . $day . '</span></li>';
            }else if($day == date('d')){
                echo '<li class="current"><span>' . $day . '</span></li>';
            }else{
                echo '<li><span>' . $day . '</span></li>';
            }
        }
    }
?>
</ul>

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

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

$currentMonth = date('m');
    $daysInMonth = date('t');
    $currentDay = 0;
    $firstOfMonthDay = date('w', strtotime('2017-01-01'));
    nextWeek = true;


    while(nextWeek){ // displays weekly fields
        counter = 1;
        while(counter <= 7){ // displays empty box or date
            formatBox();
            if($firstOfMonthDay == $counter){
                // starts printing date
                $currentDay++;
            }
            if($currentDay > 0 && $currentDay <= $daysInMonth){
                // prints date while the month has valid days
                printDay();
            }
            $currentDay++;
            counter++;
        }
        if($currentDay < $daysInMonth){
            // stops printing new weeks when there are no more valid
            // days in the month
            nextWeek = false;
        }
    }
0 голосов
/ 18 декабря 2018

Итак, исходя из вашего примера, вы фактически выводите информацию за ноябрь 2017 года, которая начинается в среду.

Чтобы достичь того, что вы ищете, вам просто нужно выяснить, какой день неделизатем добавьте дополнительные «пустые» элементы в ваш массив $list, если вам нужно заполнить месяц.

Чтобы узнать день недели, используйте:

... // Your existing code under Make List
$year = date('Y', strtotime('-1 year'));

$date = '01-' . $month . '-' . $year;
$dayofweek = date('w', strtotime($date));

Сейчас$dayofweek будет содержать числовой номер недели, где 0 - воскресенье, 1 - понедельник и т. Д.

Далее просто добавьте пустые элементы в массив списка, чтобы добавить количество дней, которое должно бытьempty:

if ($dayofweek == 0) $dayofweek = 7;
for (; $dayofweek > 1; $dayofweek--)
    $list[] = '';

Обратите внимание, что там, где начальный день - воскресенье, я изменяю его на 7, чтобы заполнить 6 полей.

Наконец, когда вы выводите элементы списка, просто добавьтепустой день <li> для каждого дополненного дня:

... // Your existing code
foreach($list as $day){
    if ($day == '')
        echo '<li>Empty day</li>';
    else if($day < date('d')){
        ... // Your existing code continues
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...