views:

52

answers:

1

Let's say you were given the arrival date 12/28/10 and a departure date of 1/5/11, in the form of an array ( which is always consistent and can be relied upon ) such as:

$data = array(
0 => array(
'Date' => '12/28/10',
'Price' => 100
),
1 => array(
'Date' => '12/29/10',
'Price' => 100
),
2 => array(
'Date' => '12/30/10',
'Price' => 100
),
3 => array(
'Date' => '12/31/10',
'Price' => 100
),
4 => array(
'Date' => '1/1/11',
'Price' => 100
),
5 => array(
'Date' => '1/2/11',
'Price' => 100
),
6 => array(
'Date' => '1/3/11',
'Price' => 100
),
7 => array(
'Date' => '1/4/11',
'Price' => 100
)
);

How could I generate a table summarising the two weeks of rates up, with the first table cell starting on Sunday and the last table cell on Saturday?

The output would need to be something like:

<table>
<tr>
        <thead>
                                                            <tr>
                                                            <th>Sun</th>
                                                            <th>Mon</th>
                                                            <th>Tue</th>

                                                            <th>Wed</th>
                                                            <th>Thu</th>
                                                            <th>Fri</th>
                                                            <th>Sat</th>
                                                            </tr>
                                                        </thead>
<tbody>
<tr>
<td>12/26</td>
<td>12/27</td>
<td>12/28</td>
<td>12/29</td>
<td>12/30</td>
<td>12/31</td>
<td>1/1</td>
</tr>
<tr>
<td>$100</td>
<td>$100</td>
<td>$100</td>
<td>$100</td>
<td>$100</td>
<td>$100</td>
<td>$100</td>
</tr>
<tr>
<td>1/2</td>
<td>1/3</td>
<td>1/4</td>
<td>1/5</td>
<td>1/6</td>
<td>1/7</td>
<td>1/8</td>
</tr>
<tr>
<td>$100</td>
<td>$100</td>
<td>$100</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>

What I have so far done, is:

$firstDay = strtotime( $data[0]['Date'] );
$firstSunday = strtotime('last sunday', $firstDay);
$lastDay = strtotime( $data[count($data)-1]);
$lastSaturday = strtotime('saturday', $lastDay);

$nights = (( $lastSaturday - $firstSunday ) / 86400) + 1;
$numWeeks = $nights / 7;

for ( $i=0; $i< $numWeeks; $i++) {
}

However I'm not sure if what I'm doing is right, that is looping through the weeks.. because I can't seem to get a reference to the day I want inside of that loop.

Previously, I did not need to generate the mm/dd row so I could rely on looping through all the days, but it's gotten more complex since I need two rows per week now.

+2  A: 

try this, it works...

        <?php
        $firstDay = strtotime( $data[0]['Date'] );
        $firstSunday = strtotime('last sunday', $firstDay);
        $diff = (( $firstDay - $firstSunday ) / 86400);
        $diff2 = 7 - (($diff+count($data))%7);


          for($i=0;$i<$diff;$i++){   
            //Adding missing elements in front of the array
            array_unshift($data, array('Date'=> date("m/d/Y",strtotime('-1 day',strtotime($data[0]['Date']))), 'Price'=>'0'));    
          }
          for($i=0;$i<$diff2;$i++){    
            //Adding missing elements in end of the array
            array_push($data, array('Date'=> date("m/d/Y",strtotime('+1 day',strtotime($data[count($data)-1]['Date']))), 'Price'=>'0'));    
          }

        //table header
        //cicle until the length of $data (num of days) array will reach
        //$i increment by 7 every cicle to simulate the week 
        //by this you don't need successive counts to retrive corret Date and price from array 
        for($i=0;$i<count($data);$i=$i+7){
            //Every week the $days and price are reset to null
            $days="";
            $price="";
            //cicle the 7 days in a week
            for($j=0;$j<7;$j++){
                //add the columns Date ($i+$j) is used to retrive the correct array pos 
                //$j is the day in the "current" week
                //$i is the "past week" days 
                $days.="<td>".$data[$i+$j]['Date']."</td>";
                $price.="<td>".$data[$i+$j]['Price']."</td>";
              }
              //week finished add 2 rows and the respective cols
           echo "<tr>".$days."</tr><tr>".$price."</tr>";
        }
        //table Footer
?>
Marcx
Wow, seems to work quite well. Could you explain the inner for loop?
meder
edited the answer with a simplification...
Marcx