Вся херня из-за того, что each перемещает позицию итератора в массиве, тоесть при выполнении последней итерации у тебя позиция в массиве не последний элемент, а все, конец массива (что-то типа std::vector.end() в сях, по нормальному барьер называется), повидимому в функции prev сначала идёт проверка на валидность позиции курсора, а потом только смещение, если ты заметил в первом var_dump(prev($aTime)); выводится false, что значит, что достигнут конец массива. Заменяешь первый prev на end, у тебя курсор смещается на последний валидный элемент, потом делаешь prev, и все заработает.
if ($name ==
'nextday') {
// лучше:
// if (!current($name)) {
// тогда в конец массива точно попадёшь
end($aTime);
// возвращаемся из конца массива в nexday
prev($aTime);
// и next night
} Но вообще, этож писец какой-то, а не обработка массива )
Спустя 2 минуты 39 секунд добавил
по поводу if (!current($name)) { я имелл ввиду, что если у тебя в public $time = array(...); добавится еще элемент в конец, типа 'nextweek' => array('id' => 6, 'time' => 100500), то ты со своим if ($name == 'nextday') встрянешь )