MySQL Разделить запрос на несколько Html таблиц - PullRequest
0 голосов
/ 20 апреля 2020

Я использую базовый c запрос имени ORDER BY из MySQL и пытаюсь разбить данные по алфавиту на отдельные html таблицы / или добавить разрыв строки ... так, например, в настоящее время выводит примерно так:

Name
adam
angel
Bert
Bob
Chloe
Courtney

Но мне бы хотелось, чтобы вывод был ....

Name
adam
angel

Bert
Bob

Chloe
Courtney

Какой лучший способ добавить разрыв строки или пустую ячейку, чтобы это произошло ?

Сейчас я просто повторяю данные:

$sql = "SELECT name FROM test ORDER BY name ASC";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo " <tr>";
        echo "<li>" . $row['name'] . "</li>";
        echo " </tr>";
    }
} else {
    echo "0 results";
}

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Примерно так должно работать

$sql = "SELECT name FROM test ORDER BY name ASC";
$result = $conn->query($sql);    
$previousFirstChar = NULL;

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        if(!is_null($previousFirstChar) && substr($row['name'], 0, 1) != $previousFirstChar){
            echo "<tr></tr>";
        }
        echo " <tr>";
        echo "<li>" . $row['name'] . "</li>";
        echo " </tr>";
        $previousFirstChar = substr($row['name'], 0, 1);
    }
} else {
    echo "0 results";
}

Здесь мы отслеживаем последний использованный первый символ, и если текущий первый символ отличается, мы добавляем пустой тег <tr> на выход. Проверка is_null предотвращает появление пустого <tr> в начале вывода запроса.

Вне зависимости, я подозреваю, что вы либо хотите <td> вместо <li>, либо <ul> вместо <tr>. Вы объединяете теги списка и таблицы в этом фрагменте.

0 голосов
/ 20 апреля 2020

Прежде всего, ваша разметка неверна. Таблица имеет следующую разметку:

<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. Это немного больше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...