Прежде всего, ваша разметка неверна. Таблица имеет следующую разметку:
<table>
<tr>
<td>Row1</td>
</tr>
<tr>
<td>Row2</td>
</tr>
</table>
Секунда: Самый простой подход - создать новую таблицу каждый раз, когда меняется символ
$currentCharacter = 'a';
echo "<table>";
while($row = $result->fetch_assoc()) {
echo " <tr>";
echo "<td>" . $row['name'] . "</td>";
echo " </tr>";
if($currentCharacter != $row[0][0]) {
$currentCharacter = $row[0][0];
echo "</table></table>";
}
}
echo "</table>";
В PHP вы можете обработать строки как массивы, чтобы получить элемент в указанной позиции c. Таким образом, условие if выполняется только в том случае, если первая буква имени не та, что была раньше. Этот подход работает только в том случае, если содержимое массива уже отсортировано, что вы и делаете, так что все в порядке.
Гораздо более понятный подход заключается в сортировке результата запроса в массив с 26 элементами из до z, так что вам нужно всего 2 вложенных цикла foreach. Это немного больше работы.