Предположительно, первый вызов проходит через все элементы итератора (то есть вызывает next (), пока valid () не станет false). Разумное поведение для iterator_to_array состоит в том, чтобы начать преобразование с текущей позиции в итераторе - перемотка без вывода сообщений будет негибкой и, возможно, приведет к ошибке.
Попробуйте перемотать итератор перед повторным использованием.
$p=new DatePeriod(date_create('2008-01-01'),
DateInterval::createFromDateString( "+2 days" ),
date_create('2008-12-31'));
echo count(iterator_to_array($p)); //183
$p->rewind(); // Newly added!
$a=iterator_to_array($p);
echo count($a); //0