tags:

views:

116

answers:

2

Given the following dates:

6/30/2010 - 7/6/2010

and a static variable:

$h = 7.5

I need to create an array like:

Array ( [2010-06-30] => 7.5 [2010-07-01] => 7.5 => [2010-07-02] => 7.5 => [2010-07-05] => 7.5 => [2010-07-06] => 7.5) 

Weekend days excluded.

No, it's not homework...for some reason I just can't think straight today.

+1  A: 

For PHP >= 5.3.0, use the DatePeriod class. It's unfortunately barely documented.

$start = new DateTime('6/30/2010');
$end = new DateTime('7/6/2010');
$oneday = new DateInterval("P1D");

$days = array();
$data = "7.5";

/* Iterate from $start up to $end+1 day, one day in each iteration.
   We add one day to the $end date, because the DatePeriod only iterates up to,
   not including, the end date. */
foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day) {
    $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */
    if($day_num < 6) { /* weekday */
        $days[$day->format("Y-m-d")] = $data;
    } 
}    
print_r($days);
gnud
When I run this I get Array ( [2010-06-30] => 7.5 [2010-07-01] => 7.5 [2010-07-02] => 7.5 [2010-07-05] => 7.5 ) It's missing the last day, 7/6.Am I missing something simple?
Jason
Seems like changing $end = '7/6/2010'; to $end = date ( 'm/d/Y' , strtotime ( '+1 day' , strtotime ('7/06/2010') ) );Gets me what I'm looking for.
Jason
Yes, the DatePeriod appearently stops _before_ the end-date. My bad, fixed.
gnud
A: 

The simplest method:

$start = strtotime('6/30/2010');
$end = strtotime('7/6/2010');
$result = array();
while ($start <= $end) {
    if (date('N', $start) <= 5) {
        $current = date('m/d/Y', $start);
        $result[$current] = 7.5;
    }
    $start += 86400;
}
print_r($result);

UPDATE: Forgot to skip weekends. This should work now.

Stephen
Watch out for daylight savings
Mark Baker
Hmm.. Good point.
Stephen