No es necesario hacer un ciclo repetitivo para la función UltimoDia(), es un poco más simple de resolver.
Los meses 1,3,5,7,8,10,12 siempre tienen 31 días, los meses 4,6,9,11 siempre tienen 30 días, el único problema es el mes de febrero dependiendo del año puede tener 28 o 29 días, pero ese cálculo tampoco es dificil.
Aquí envío el código para la función UltimoDía(), que ojalá les sirva...
function UltimoDia($anho,$mes){
if (((fmod($anho,4)==0) and (fmod($anho,100)!=0)) or (fmod($anho,400)==0)) {
$dias_febrero = 29;
} else {
$dias_febrero = 28;
}
switch($mes) {
case 01: return 31; break;
case 02: return $dias_febrero; break;
case 03: return 31; break;
case 04: return 30; break;
case 05: return 31; break;
case 06: return 30; break;
case 07: return 31; break;
case 08: return 31; break;
case 09: return 30; break;
case 10: return 31; break;
case 11: return 30; break;
case 12: return 31; break;
}
}