Это ужасно.
1. Отделяйте разметку от логики, вы не на реакте. Вынесите ее в отдельный файл, необязательно прикручивать шаблонизаторы, просто в отдельный файл, подключать include.
2. Отвратное форматирование. Казалось бы, мелочь, но дьявол кроется в мелочах, и по факту мелочи - едва ли не самое важное. Почитайте про PSR.
3. Нестрогое сравнение, extend пункта выше. Глаза режет, честно говоря, а еще - увеличивает риск ошибок.
4. Императивный стиль. Хотя бы проверки стоит вынести в предикаты вроде isSomething(), сразу будет читабельней раза в два.
5. Касательно самого алгоритма, решение быстрое и в лоб, но я бы создал матрицу и далее вывел бы ее циклом в шаблоне. Для создания матрицы цикл не нужен, т.к. достаточно заполнить несколько одномерных массивов последовательным рядом чисел и затем их собрать.