Credo che il problema stia nel fatto che hai aggiunto due righe in rowSpaned()In pratica devi gestire ogni singola colonna separatamente dalle altre tenendo conto del valore di rowspan calcolato. Se la seconda cella di una riga ha lo stesso valore delle 2 celle sottostanti allora ha rowspan 3 quindi dovrai omettere dalla tabella le 2 celle sottostanti successive. E questo discorso lo dovresti fare per ogni colonna. Il codice che ti ho postato tiene conto solo dei vaolri relativi al prezzo_singolo.Codice PHP:
function rowSpaned($arr){
return '<tr><td>'.$arr['inizio'].'</td>
<td>'.$arr['fine'].'</td></tr>';
/*<td>'.$arr['prezzo_singola'].'</td>
<td>'.$arr['prezzo_doppia'].'</td> */
}