visto così sembrerebbe un classico problema di "riscrittura" della variabile di sessione, mi spiego: viene controllata la presenza o meno del tipo di prodotto VIRTUALE, partendo dal presupposto che all'inizio tutti i prodotti siano di tipo FISICO.

Nel momento però in cui il sistema trova un prodotto VIRTUALE, imposta il flag di controllo per indicare "presenza di prodotto virtuale",ma settando questo flag si perde anche l'informazione della presenza dei precedenti prodotti di tipo FISICO.

Per ovviare a questo problema la cosa più semplice è utilizzare DUE flag del tipo $_SESSION['spese'], ad esempio $_SESSION['speseTipo1'] e $_SESSION['speseTipo2']: a questo punto basta un semplice controllo in AND o OR per controllare i form.

Se $_SESSION['speseTipo1'] è true vuol dire che nel carrello è presente almeno un prodotto di tipo1;
Se $_SESSION['speseTipo2'] è true vuol dire che nel carrello è presente almeno un prodotto di tipo2;

se uno dei due è false siamo in presenza di un carrello con prodotti omogenei.