The only thing I might add would be to only select items whose date was =/> current month and have the query do the sort - saves the 1st two steps. You'd also want the sort to be ascending - lowest date to highest.
Also would need to figure how to handle months (including current) with no news items - e.g. skip, display month header and a message, etc.
EDIT: One of the numerous Calendar/Event applications rhat display a month at a time will have code very similar to what you want to do.
Edited by dpyers