Для таблицы 10 х 10 понадобится выводить 11 х 11, ведь добавляются заголовки строк / столбцов.
HTML лучше собирать в одной переменной. И вывести её в самом конце.
Сделайте для начала без динамики, без всех этих
$_POST['size']
статичную таблицу 3х3.
1, 2, 3; А, Б, В
$size = 3;
$rowTitles = explode(',', 'А,Б,В,Г,Д,Е,Ж,З,И,К');
$html = '';
for ($row = 0; $row <= $size; $row++) {
$tr = '';
for ($col = 0; $col <= $size; $col++) {
if ($row === 0) {
// строка с номерами столбцов
if ($col === 0) {
$tr .= '<th></th>'; // угловая пустая ячейка
} else {
$tr .= '<th>' . $col . '</th>'; // название столбца
}
} else {
// строка с обычными клеточками
if ($col === 0) {
// название строки
$tr .= '<th>' . $rowTitles[$row - 1] . '</th>';
} else {
// обычная клеточка
$tr .= '<td>' . $rowTitles[$row - 1] . $col . '</td>';
}
}
}
$html .= $tr . PHP_EOL;
}
$html = '<table><tbody>' . $html . '</tbody></table>';
echo $html;