Funny you should ask this because I've been meaning to share some code that
I wrote a few months ago that does exactly this for any day of the week.

Please feel free to use this and make changes. I'd appreciate any
changes/bug fixes being sent back to me though.

<?php
/*
 * num_days
 *
 * A function that takes a day, a month and a year and returns the number of
 * occurrences of that day in the given month and year.
 *
 * Arguments:
 *      day - the day required
 *      month - which month are we talking about
 *      year - which year are we talking about
 *
 * Returns:
 *      occ - the number of times the day occurs in the month.
 *      or NULL if there are invalid parameters.
 */
function num_days ($day, $month, $year)
{
        $day_array = array("Mon" => "Monday",
                           "Tue" => "Tuesday",
                           "Wed" => "Wednesday",
                           "Thu" => "Thursday",
                           "Fri" => "Friday",
                           "Sat" => "Saturday",
                           "Sun" => "Sunday");

        $month_array = array(1 => "Jan", "Feb", "Mar", "Apr", "May", "Jun",
                             "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");

        /*
         * Check our arguments are valid.
         */

        /*
         * $day must be either a full day string or the 3 letter
abbreviation.
         */
        if (!(in_array($day, $day_array) ||
            array_key_exists($day, $day_array))) {
                echo "num_days: invalid argument. \$day must be day name or
three letter abbreviation";
                return;
        }

        /*
         * $month must be either a full month name or its 3 letter
abrreviation
         */
        if (($mth = array_search(substr($month,0,3), $month_array)) <= 0) {
                echo "num_days: invalid argument. \$month must be month name
or three letter abbreviation";
                return;
        }

        /*
         * Now fetch the previous $day of $month+1 in $year;
         * this will give us the last $day of $month.
         */

        /*
         * Calculate the timestamp of the 01/$mth+1/$year.
         */
        $time = mktime(0,0,0,$mth+1,1,$year);

        $str = strtotime("last $day", $time);

        /*
         * Return nth day of month.
         */
        $date = date("j", $str);

        /*
         * If the difference between $date1 and $date2 is 28 then
         * there are 5 occurences of $day in $month/$year, otherwise
         * there are just 4.
         */
        if ($date <= 28) {
                return 4;
        } else {
                return 5;
        }
}

?>

The other function I have does this:

/*
 * nth_day
 *
 * A function that takes a number and a day and returns the date of
 * nth occurrence of that day in the given month and year.
 *
 * Arguments:
 *      nth - the nth occurence required
 *      day - the day required
 *      month - which month are we talking about
 *      year - which year are we talking about
 *
 * Returns:
 *      date - the date on which the nth day occurs in month and year.
 *      or NULL for errors.
 */

Give me a shout if anyone wants this one.

Cheers, Greg.


> -----Original Message-----
> From: Phil Dowson [mailto:[EMAIL PROTECTED] 
> Sent: 29 September, 2003 16:22
> To: [EMAIL PROTECTED]
> Subject: [PHP] How many Mondays in a month?
> 
> 
> Hi,
> 
> I have posted a similar question in php.db, but I was 
> wondering if someone could help out with a non-db issue. I am 
> trying to display statistics of visitors to my web site, and 
> what I would like to do is show the average number of 
> visitors that have visited the site in a given month for a 
> certain day e.g..:
> 
> Stats for www.mysite.com for 09/2003
> 
> Monday - 15 average - 65 total
> Tuesday - 16 average - 66 total
> Wednesday - 14 average - 65 total
> Thursday - 13 average - 63 total
> Friday - 15 average - 65 total
> Saturday - 5 average - 25 total
> Sunday - 6 average - 28 total
> 
> I have tried a number of ways to do this, but I cannot work 
> out a way to show the number for example Mondays that will be 
> in a given month, which I need to work out the average. I can 
> work out the total easy enough, just not the average.
> 
> TIA
> 
> Phil Dowson
> 
> -- 
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
> 
> 

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to