If you have an object that represents some sort of indexable collection you can implement ArrayAccess so that you can have all the functionality of your object relevant to the collection, and also access it as an array. That requires you to write all the array access functionality though, so if you don't want to do all that you can extend ArrayObject instead. ArrayIterator is to allow multiple concurrent iterations over an ArrayObject by having an object to manage iteration state for each one.
That said, I haven't had much use for them as they don't support HOFs like array_map.