La forma que yo utilizo es agrupar los datos en un arreglo, por ejemplo, para tu caso, podría ser
Código PHP:
Ver original $arreglo[$fila['grado']][$fila['asignatura']][$fila['desempeno']][]=$fila['logro'];
Esto creará un arreglo asociativo, que puedes recorrer con foreach, puede ser recursivo si tu arreglo no tiene una cantidad de niveles definido, o si sabes que sólo hay 4 niveles (en tu ejemplo) puedes anidar 4 foreach
Código PHP:
Ver originalforeach($arreglo as $grado =>$arreglo_n2){//recorremos y obtenemos la primer columna (grado)
$nfilas=cuenta_filas($arreglo_n2);//función para contar elementos de un arreglo.
echo '<tr><td rowspan="'.$nfilas.'">'.$grado.'</td>';
foreach($arreglo_n2 as $asignatura =>$arreglo_n3)
-
-
-//demás código.
}
la función para contar elementos o filas del arreglo sí debe ser recursiva, se trata de profundizar en el arreglo hasta que se llegue a los nodos finales
Código PHP:
Ver originalfunction cuenta_filas($arreglo){
if(!is_array($arreglo))//si llegue al nodo (no es un arreglo) return 1;
$suma=0;
foreach($arreglo as $clave =>$valor)
$suma+=cuenta_fila($arreglo);
return $suma;
}