Segun la documentación de SPL, cada vez que tu llamas a detach, la lista se reduce y se regresa al primer elemento, por lo que siempre te pasara eso y necesitaras llamar a
Código PHP:
$lista->detach($lista->current());
Al final de tu foreach. Otra opción es que extiendas SplObjectStorage e implementes un método clear.
Saludos.