Почему не нужно заранее объявлять массив?
Как правильно заметили в комментарии выше, "это РНР, тут так можно".
Раньше вообще можно было инициализировать переменную как строку,
и потом обращаться к ней, как к массиву.
Начиная с 7 версии начался отход от таких вольностей, но он всё ещё в процессе.
Значит то что пишут $result = [] Это я удобства?
Не для "удобства", а для того, чтобы волосы на голове сохранились подольше.
В данном случае нужды в явном присвоении нет.
Но любой код со временем изменяется. И функция tower_builder() может разрастись. Там появится ещё один цикл, который работает с массивом $result. Который получит какое-то значение до начала нашего цикла, и в итоге конечный результат будет неправильным. Поэтому $result = [] перед началом работы с массивом - это не каприз или удобство, а необходимость