Las diferencias entre while() y foreach() son minúsculas, así que cambiar el loop por foreach() no resuelve nada, o mejor aún:
¡ni siquiera tienes un problema serio!
En todo caso usar while() es mucho más efectivo que usar foreach() por la única razón de que no tienes un array 100% conformado: es por ello que un while() es correcto, pues va construyendo los arrays mientras se itera.
Para usar foreach() tendrías primero que extraer todos los registros y crear un array nuevo con ellos, para entonces volver a iterar e imprimir: lo que es básicamente hacer el mismo trabajo dos veces.