puede agrupar ya en la base de datos u ordenar por sección y luego iterar y generar el código de separación adecuado cuando cambia la sección. una matriz temporal también es una solución. dado su código de ejemplo, esto puede indicarle una posible dirección (aunque la matriz temporal, por supuesto, no es una solución elegante, pero si los datos no son tantos, realmente no importa)
<?
$result = array();
$result[] = array('section' => 'php','note' => 'bla');
$result[] = array('section' => 'php','note' => 'bla');
$result[] = array('section' => 'perl','note' => 'bla');
$result[] = array('section' => 'java','note' => 'bla');
$grouped = array();
for($i=0;$i<count($result);$i++) {
$grouped[$result[$i]['section']][] = $result[$i]['note'];
}
print_r($grouped);
?>