если на коленке
$arr = [
8 => '',
9 => '',
10 => '',
11 => '',
12 => '12:30',
13 => '',
14 => '',
15 => '',
16 => '',
17 => '',
18 => '',
19 => '',
20 => '',
21 => '',
22 => '',
];
$values = array_flip(array_filter($arr));
$key = array_pop($values);
$dt = \DateTime::createFromFormat('H:i', $arr[$key]);
foreach ($arr as $k => $v) {
if (empty($v)) {
$v = clone $dt;
if ($k < $key) {
$v->sub(new \DateInterval('PT' . (($key-$k) * 30) . 'M'));
} else {
$v->add(new \DateInterval('PT' . (($k-$key) * 30) . 'M'));
}
$arr[$k] = $v->format('H:i');
}
}
P.S. Так же возможна ситуация, что массив содержит два или три значения, и нужно заполнить ячейки между ними.
если интервал такой же в 30 мин, то прокатит