Is this coming from a database query? If so, it might be easier and more efficient to do the grouping in your query. But to do it within PHP, you could build a new array organized by year, something like:
<?php
// test data:
$events = array(
array('event_name' => 'foo', 'event_start_date' => '2009/02/01', 'event_hours' => 2),
array('event_name' => 'bar', 'event_start_date' => '2009/03/01', 'event_hours' => 3),
array('event_name' => 'manny', 'event_start_date' => '2010/02/01', 'event_hours' => 4),
array('event_name' => 'moe', 'event_start_date' => '2010/03/01', 'event_hours' => 5),
array('event_name' => 'jack', 'event_start_date' => '2010/04/01', 'event_hours' => 6)
);
// build summary array:
$sorted = array();
foreach($events as $event)
{
$year = date('Y', strtotime($event['event_start_date']));
if(empty($sorted[$year]['total_hours']))
{
$sorted[$year]['total_hours'] = 0;
}
$sorted[$year]['events'][] = $event;
$sorted[$year]['total_hours'] += $event['event_hours'];
}
// show results:
echo "<pre>".print_r($sorted, 1)."</pre>";
Output:
Array
(
[2009] => Array
(
[total_hours] => 5
[events] => Array
(
[0] => Array
(
[event_name] => foo
[event_start_date] => 2009/02/01
[event_hours] => 2
)
[1] => Array
(
[event_name] => bar
[event_start_date] => 2009/03/01
[event_hours] => 3
)
)
)
[2010] => Array
(
[total_hours] => 15
[events] => Array
(
[0] => Array
(
[event_name] => manny
[event_start_date] => 2010/02/01
[event_hours] => 4
)
[1] => Array
(
[event_name] => moe
[event_start_date] => 2010/03/01
[event_hours] => 5
)
[2] => Array
(
[event_name] => jack
[event_start_date] => 2010/04/01
[event_hours] => 6
)
)
)
)
It should then be a fairly simple matter to use a foreach loop or two to output the data as desired.