intanto.... ulteriore correzione, non avevo considderato se le date sono nello stesso mese...

Codice PHP:
function calcolaNotti($checkIn,$checkOut)
{
    
// usare formato yyyy-mm-dd
    // la funzione restituisce un array('notti'=>'tot','mese'=>'notti','mese'=>'notti',........);
    // seconto quanti mesi vengono esaminati
    
    
$mesi = ['01'=>'Gen','02'=>'Feb','03'=>'Mar','04'=>'Apr','05'=>'Mag','06'=>'Giu',
                
'07'=>'Lug','08'=>'Ago','09'=>'Set','10'=>'Ott','11'=>'Nov','12'=>'Dic'];
    
    
$giornoIn substr($checkIn,8,2);
    
$giornoOut substr($checkOut,8,2);
    
    
$meseIn substr($checkIn,5,2);
    
$meseOut substr($checkOut,5,2);

    
$annoIn substr($checkIn,0,4);

    
$result = [];

    
// calcola la differenza totale
    
$checkIn1 date_create($checkIn);
    
$checkOut1 date_create($checkOut);
    
$diff date_diff($checkIn1$checkOut1);
    
$totNotti $diff->format('%a');
    
$result['notti'] = $totNotti;
    
    
// funzione che calcola diff per mese
    
function finemese($data)
    {
        
$split split('-'$data);
        
$day $split[2];
        
$month $split[1];
        
$year $split[0];
        
        
$res true;
        
$count 0;
        while(
$res)
        {
            
$check checkdate($month$day$year);
            if(
$check)
            {
                
$day++;
                
$count++;
                
$res true;
            }
            else{
$res false;}
        }
        
        return 
$count;
    }
    
    
// restituisce i giorni per ogni mese
    
$mOut = (int)$meseOut;
    
$mIn = (int)$meseIn;
    
$mesiToccati $mOut $mIn;
    if(
$mesiToccati 1)
    {
        
$giorno $giornoIn;
        
$start = (int)substr($checkIn,5,2);
        
$end = (int)substr($checkOut,5,2);
        for(
$i=$start$i<$end$i++)
        {
            if(
$i<10){$ii = (string)'0'.$i;}
            else{
$ii = (string)$i;}
            
$nottiMese finemese($annoIn.'-'.$ii.'-'.$giorno);
            
$nomeMese $mesi[$ii];
            
$result[$nomeMese] = $nottiMese;
            
$giorno '01';
        }
        
$nomeMeseOut $mesi[$meseOut];
        
$result[$nomeMeseOut] = ((int)$giornoOut) - 1;
    }
    elseif(
$mesiToccati==1)
    {
        
$nottiMese1 finemese($checkIn);
        
$nomeMese1 $mesi[$meseIn];
        
        
$nottimese2 $totNotti $nottiMese1;
        
$nomeMese2 $mesi[$meseOut];
        
        
$result[$nomeMese1] = $nottiMese1;
        
$result[$nomeMese2] = $nottimese2;
    }
    
    return 
$result;