Non e' cosi' oscura la cosa....
quello che ho notato e' che manipolando l'array $_SESSION in quanto tale... cioe' come array e con le funzioni degli array (ma non tutte), si ha che $_SESSION "perda" (concedimi il termine) delle sue peculiari caratteristiche di array di sessione sempre registrato.
Succede che gli indici manipolati "paiono" non essere piu' registrati, e di conseguenza non vengono trasferiti nella serializzazione depositata nel file di sessione. Che sia corretto od errato non lo saprei dire. Se dopo la manipolazione dichiari $_SESSION globale allora i suoi elementi tornano ad essere tutti registrati.
Questo comportamento e' cambiato con il rilascio php 5.0.4 subito passato 5.0.5. Con la 5.0.3 non succedeva. L'ho trovato perche' in alcuni script passavo di botto tutto il $_POST in $_SESSION per il trasporto dei dati in paginazione o altre pagine e mi trovavo le sessioni "VUOTE". Ho dovuto modificare degli script funzionanti dalle release 4.3.x e trasferire i dati con un ciclo foreach.
Ora potrebbe benissimo essere che nei nuovi rilasci questo problema non ci sia piu', non l'ho piu' provato, anche perche' mi va a pennello il ciclo foreach. Se tu gestisci i dati singolarmente per indice tutto OK, gestiti invece a livello complessivo di array sembrerebbe che questo indice cosi' trasferito in $_SESSION perda la registrazione in sessione o meglio, acquisisca oltre ai dati anche le caratteristiche dell'array stesso che viene trasferito (che non e' registrato).
Questo succede (o succedeva) con php 5.0.5 - apache 2.0.52 su win xp. Ora in 5.1.4 non lo so.
Segnalato al team php e' stato classificato come "bogus".....
Se ritrovo il link te lo segnalo.
Per me il vero bug e' che se dichiaro GLOBAL $_SESSION dopo questi trasferimenti gli indici vengono nuovamente registrati.