1/12/2012

Better PHP Calendar Class

I've dealt with creating monthly calendars in PHP and it has always been a bit of pain. How exactly to show the days in the month in a table without creating ugly and hard to maintain code? I believe this time I was able to find a good solution.

A PHP Class

It's a PHP class that will output the dates of the given month in array. But in order to make the dates fit their place in the week, the class outputs zeros in the place of "empty" days. So the first week of a month starting in Wednesday would be this array:

[0, 0, 1, 2, 3, 4, 5]

This allows you to loop through the returned arrays without worrying where to start the week. If you use a table, you could simply output " " when the date is 0 and output the number (and colored background) when the date is a number. Here is an example in HTML:

Using the output in HTML:


<table>
    <tr><th>Mon</th><th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th><th>Sat</th><th>Sun</th></tr>
    <?php for($i=1;$i<=$num_weeks;$i++):?>
        <tr>
            <?php $days=$_calendar->days($m[0], $m[1], $i, $num_weeks);
            foreach($days as $day):?>
                <td><?=$day?$day:"&nbsp;"?></td>
            <?php endforeach;?>
        </tr>
    <?php endfor;?>
    </table>


Easy, eh? We just output a table row for every week in the month ($num_weeks is also a method in the class as you'll see below) and for the days with date we output the date (otherwise just blank space).

You can see how it works live in this period calendar.

The PHP Code

Now, here is how it all works. I created a class to hold 3 functions:

num_weeks($month, $year) - to calculate the number of weeks in the given month and year

first_day($month, $year) - to find out which day of the week is the first day of a given month.year

days($month, $year, $week, $num_weeks=0) - this is the main method that returns the array of 7 days. The week starts in Monday.

Here is the full code below and some comments to it:

function num_weeks($month, $year)
    {
        // every month has at least 4 weeks
        $num_weeks=4;
    
        // finding where it starts
        $first_day = $this->first_day($month, $year);  
        
        // if the first week doesn't start on monday 
        // we are sure that the month has at minimum 5 weeks
        if($first_day!=1) $num_weeks++;
        
        // find the "widow" days (i.e. empty cells in the 1st week)
        $widows=$first_day-1;  
        $fw_days=7-$widows;
        if($fw_days==7) $fw_days=0;       
        
        // number of days in the month
        $numdays=date("t",mktime(2, 0, 0, $month, 1, $year));
        
        if( ($numdays - $fw_days) > 28 ) $num_weeks++;
         // that's it!
        return $num_weeks;                  
    }


Then the first_day function:

function first_day($month, $year)
    {
        $first_day= date("w", mktime(2, 0, 0, $month, 1, $year));
        if($first_day==0) $first_day=7; # convert Sunday
        
        return $first_day;
    }


And here is the most important one:
// here $week is the week number when we go in a loop
// (see the html code that I posted earlier to get better idea)
function days($month, $year, $week, $num_weeks=0)
{
        $days=array();

        // this is just to avoid calling num_weeks every time 
        // when you loop through the weeks        
        if($num_weeks==0) $num_weeks=$this->num_weeks($month, $year);
        
        // find which day of the week is 1st of the given month        
        $first_day = $this->first_day($month, $year);
                
        // find widow days (first week)
        $widows=$first_day-1;
        
        // first week days
        $fw_days=7-$widows;
        
        // if $week==1 don't do further calculations
        if($week==1)
        {
            for($i=0;$i<$widows;$i++) $days[]=0;            
            for($i=1;$i<=$fw_days;$i++) $days[]=$i;            
            return $days;
        }
        
        // any other week
        if($week!=$num_weeks)
        {
            $first=$fw_days+(($week-2)*7);
            for($i=$first+1;$i<=$first+7;$i++) $days[]=$i;            
            return $days;
        }
        
        
        # only last week calculations below
        
        // number of days in the month
        $numdays=date("t",mktime(2, 0, 0, $month, 1, $year));
                
        // find orphan days (last week)  
        $orphans=$numdays-$fw_days-(($num_weeks-2)*7);                     
        $empty=7-$orphans;
        for($i=($numdays-$orphans)+1;$i<=$numdays;$i++) $days[]=$i;
        for($i=0;$i<$empty;$i++) $days[]=0;
        return $days;
    }


That's it! Any questions?

42 comments:

  1. PHP is the best server side scripting language! I was is search of this php calender code ,thanks for sharing. I hope to see some more interesting php codes in this blog in near future.

    Ecommerce Design

    ReplyDelete
  2. I was looking for the same calendar info for a long time thanks for sharing.

    ReplyDelete
  3. It is great for beginner PHP learners.Thanks for all these information i hope to see more interesting and knowledgeable blog in near future.

    ReplyDelete
  4. Find a php calendar here: http://bohemiawebsites.com/component/option,com_jdownloads/Itemid,382/cid,68/task,view.download/

    You can find more than 300 pages worth of php tutorials at http://bohemiawebsites.com/Our-Blog.html

    ReplyDelete
  5. PHP contain the many class.but calender class provide the long time information.it also show the day and hours.actually its is great.

    ReplyDelete
  6. Great Post for PHP learners..This is wonderful post. I do hope you intend to post more of these types of information. Thank you for this interesting information...
    Web Designing Company in Chandigarh

    ReplyDelete
    Replies
    1. EMC SAN Online Training is a best course all top company requires this,W3 D technology provides EMC SAN Online Training course with Certification and E-books , Videos
      EMC SAN Online Training | Storage Area Network Course

      Delete
  7. I don't know how to use it to print calendar in HTML

    ReplyDelete
  8. After make index.php file with HTML code from above, and then file calndar.class.php and put to the index.php code only calendar header with days show up... where are days?

    ReplyDelete
  9. Thank you for the informative post. Must appreciated.
    Shashaa
    HTML5 Course in Velachery

    ReplyDelete
  10. Thanks for sharing this wonderful information.Its very nice blog PHP

    ReplyDelete
  11. thanks for giving this type of informative blog,we learn more things about tips for seo which is involves the detailed information about optimization of blogger.
    SAP Training in Chennai

    ReplyDelete
  12. EMC SAN Online Training is a best course all top company requires this,W3 D technology provides EMC SAN Online Training course with Certification and E-books , Videos
    EMC SAN Online Training | Storage Area Network Course

    ReplyDelete
  13. Nice blog on php development. The information you are providing through this blog is very helpful to beginner Php Developers .

    Thanks

    ReplyDelete
  14. Have you been thinking about the power sources and the tiles whom use blocks I wanted to thank you for this great read!! I definitely enjoyed every little bit of it and I have you bookmarked to check out the new stuff you post. java training jalandhar

    ReplyDelete

  15. This is best PHP tutorial in youtube. you can learn full coding and also the best expamles in here. This the best of learning and earning ways of youtube.
    You can the full boston php tutorial.

    click here PHP tutorial
    for more youtube tutorials
    website php tutorial for beginners

    ReplyDelete
  16. Nice to read your article! very informative.So, please keep posting PHP Stuff here Thanks.......

    ReplyDelete
  17. This blog explains the details of PHP. This helps to learn about what are all the different method is there. And the working methods all of that are explained here. Informative blog.For more Details Or information Visit Intellipaat

    ReplyDelete
  18. Hi ,
    Nice article.Thank you for sharing the information.I really glad enjoy read that topic.I appreciate post for your.
    php Training in Chandigarh

    ReplyDelete
  19. Great post..thanks for sharing the valuable content..good work keep it up.
    Best software Training institute in Bangalore

    ReplyDelete
  20. fantastic information! keep sharing.

    ReplyDelete
  21. Read all the information that i've given in above article. It'll give u the whole idea about it.

    DevOps Training in Bangalore

    DevOps Training in Pune

    DevOps Online Training

    ReplyDelete
  22. Maka dari itu, dikesempatan ini admin akan memperkenalkan kepada anda beberapa Situs QQ Terbaru dan Terpercaya yang ada di Indonesia pada tahun 2019 – 2020 ini. Diantara para pembaca artikel ini, tentu saja mencari keberuntungan dengan bermain pada website baru.
    asikqq
    dewaqq
    sumoqq
    interqq
    pionpoker
    bandar ceme terbaik
    hobiqq
    paito warna terlengkap
    syair sgp

    ReplyDelete
  23. Good information
    Best QA / QC Course in India, Hyderabad. sanjaryacademy is a well-known institute. We have offer professional Engineering Course like Piping Design Course, QA / QC Course,document Controller course,pressure Vessel Design Course, Welding Inspector Course, Quality Management Course, #Safety officer course.
    QA / QC Course
    QA / QC Course in india
    QA / QC Course in hyderabad

    ReplyDelete
  24. Thanks for sharing such a wonderful content.
    We are the best waterproofing services in Hyderabad.We are providing all kinds of leakage services which includes bathroom,roof,wash area,water tank,wall cracks,kitchen leakage services in Hyderabad. With trust and honest, we solve the issue as quick as possible.We serve you better compared to others.
    Best waterproofing services in hyderabad
    bathroom leakage services in hyderabad
    roof leakage services in hyderabad
    water tank leakage services in hyderabad
    kitchen leakage services in hyderabad
    Hyderabad waterproofing services

    ReplyDelete
  25. It's awesome.

    https://whitelabelfox.com/gojek-clone-app/

    ReplyDelete
  26. Thanks for Sharing a Very Informative Post & I read Your Article & I must say that is very helpful post for us.
    AWS Training in Pune

    ReplyDelete
  27. Thanks for choosing this specific Topic. As i am also one of big lover of this. Your explanation in this context is amazing. Keep posted these overwarming facts in front of the world.
    Printer customer support number

    ReplyDelete
  28. Very Informative blog thank you for sharing. Keep sharing.

    Best software training institute in Chennai. Make your career development the best by learning software courses.

    best rpa training in chennai
    best msbi training institute in chennai
    cloud computing courses in chennai

    ReplyDelete
  29. I believe there are many more pleasurable opportunities ahead for
    individuals that looked at your site.
    mysql dba online training in Chennai
    Unix classes in Chennai
    Best IT training institute in Chennai

    ReplyDelete