Vedi se ti torna utile. L'ho adattato a due soli periodi come nel tuo esempio ma lo puoi estendere ai prezzi di tutto l'anno. Ora devo scappare. Se hai problemi ti rispondo stanotte.
Codice PHP:
// Definisco le date di inizio e di fine di ciascun periodo
$iniz_ordinaria1 "2006-09-09"
$fine_ordinaria1 "2006-09-20"
$iniz_ordinaria2 "2006-09-21";
$fine_ordinaria2 "2006-10-10";

// Setto le mie costanti relative ai prezzi stagioniali
define("PREZZO_ORDINARIA",35);
define("PREZZO_ALTA",40);


// La funzione, dati periodo di inizio e di fine, genera un array con tutte le date comprese
// nell'intervallo, estremi compresi
function crea_Array($da,$a,$arr ''){
global 
$arr;
for(
$i strtotime($da); $i<=strtotime($a); $i strtotime("+1 day",$i))
    
$arr[] = date('Y-m-d',$i);
return 
$arr;
}

// Richiamo la funzione per crearmi l'array con tutte le date stagionali
$stagione   crea_Array($iniz_ordinaria1,$fine_ordinaria1);
$stagione   crea_Array($iniz_ordinaria2,$fine_ordinaria2);

// Date inizio e fine abbonamento
$inizio_abb "2006-09-18"
$fine_abb   "2006-09-23";

// Mi permette di creare un nuovo array con la funzione anzichè accodare gli elementi
// all'array già esistente.

// Creo l'array con tutte le date relative al periodo dell'abbonamento
$abbonamento crea_Array($inizio_abb,$fine_abb$arr =array() );

echo 
'<pre>';
print_r($stagione);
print_r($abbonamento);
echo 
'</pre>';

// La funzione mi crea un nuovo array dove i valori dell'array passato (le date), diventano
// le chiavi del nuovo array e i valori sono i prezzi relativi al periodo.
function associa($array){
global 
$stagione;
for (
$i 0$i count($array); $i++){
    
$nuovo[$array[$i]] = ($i<=11 PREZZO_ORDINARIA PREZZO_ALTA); }
return 
$nuovo;
}

// Richiamo la funzione
$mappato associa($stagione);

echo 
'<pre>';
print_r($mappato);
echo 
'</pre>';

function 
costo_Abbonamento(){
$totale 0;
global 
$abbonamento,$mappato;
foreach(
$abbonamento as $giorno){
// se il giorno dell'abbonamento corrisponde alla chiave dell'array stagionale aggiungo al totale
// il prezzo corrispondente   
      
if(array_key_exists($giorno,$mappato)) 
      
$totale+= $mappato[$giorno];
    }
return 
$totale;
}

echo 
costo_Abbonamento(); 
// 225 18-19-20 = 35*3 (105) + (21-22-23) = 40*3 (120) = 225

?>