Я делал так:
1. создаем нужный обьект (будет коллекцией), наследуем от arrayIterator (в идеале я ручками все интерфейсы применял, так он более гибкий получается, но этот вариант проще), и переопределяем методы getItem и setItem (вроде, в мануале они есть)
2. вместо Вашего 3 пункта весь массив отдаем в нашу коллекцию
3. $collection[x] возвращает обьект
В итоге избавляемся от цикла, и получаем неплохую коллекцию. Я еще делал ее более универсальную, отдавал вместе с массивом название класса которое хочу получить в итоге.
Если не понятно спрашивайте =) обьясню поподробней с примерами.