Использование PHP для создания неупорядоченных списков на основе результатов MySQL

#php #mysql #html

#php #mysql #HTML

Вопрос:

У меня есть запрос MySQL, который возвращает несколько записей. Например:

  ------- ------------ ----------- 
| group | first_name | last_name |
 ------- ------------ ----------- 
| Red   | John       | Doe       |
 ------- ------------ ----------- 
| Red   | Jane       | Doe       |
 ------- ------------ ----------- 
| Green | Bob        | Anybody   |
 ------- ------------ ----------- 
| Black | Betty      | Anybody   |
 ------- ------------ ----------- 
 

Я также определил несколько group имен в массиве PHP:

 $importantGroups = array('Red', 'Blue', 'Green');
 

Используя результаты запроса, я пытаюсь написать PHP-скрипт, который создаст неупорядоченный HTML-список для каждого group , определенного в массиве.

  • Если a group не отображается ни в каких результатах запроса, то этот список не создается.
  • Если результат имеет group значение, которого нет в массиве, оно помещается в ul в конце.

Используя результаты запроса выше, вывод HTML будет:

 <ul id="Red">
    <li>John Doe</li>
    <li>Jane Doe</li>
</ul>

<ul id="Green">
    <li>Bob Anybody</li>
</ul>

<ul id="Other">
    <li>Betty Anybody</li>
</ul>
 

Любая помощь в наилучшем способе заставить это работать?

Ответ №1:

Сначала выполните упорядочение в SQL следующим образом:

 SELECT ... ORDER BY FIELD(`group`, 'Green', 'Blue', 'Red') DESC
 

Параметры для FIELD должны быть в порядке, обратном их важности, результаты, не входящие в эту группу, будут отсортированы до конца.

Во время вывода просто переходите к новой группе всякий раз, когда вы сталкиваетесь с ней:

 $group = null;

while ($row = /* get result */) {
    if (!in_array($row['group'], $importantGroups)) {
        $row['group'] = 'other';
    }
    if ($row['group'] != $group) {
        if ($group !== null) {
            echo '</ul>';
        }
        printf('<ul id="%s">', $row['group']);
        $group = $row['group'];
    }

    printf('<li>%s</li>', $row['name']);
}

if ($group !== null) {
    echo '</ul>';
}
 

Это наиболее эффективный способ для больших наборов результатов. Если наборы не такие большие, гораздо удобнее группировать их вместе в PHP и выводить группы, как показано в других ответах.

Комментарии:

1. Отличный ответ. Я тоже был в такой ситуации раньше. Я просто использовал несколько циклов while. Это должно быть намного эффективнее.

Ответ №2:

Это немного странно, я думаю, что может быть какой-то способ повысить эффективность, но это, безусловно, работает.

 <?php
$importantGroups = array('Red', 'Blue', 'Green');

$sql = "SELECT * FROM `table`";
$result = mysql_query($sql);
while($row = mysql_fetch_array($result)){
    if(array_search($row['group'],$importantGroups)){
        $groupName = $row['group'];
    }else{
        $groupName = "Other";
    }
    $groups[ $groupName ][] = $row;
}

$importantGroups[] = "Other";

foreach($importantGroups as $groupName){
    echo '<ul id="' . $groupName . '">';
    foreach($groups[$groupName] as $element){
        echo '<li>' . $element['first_name'] . ' ' . $element['last_name'] . '</li>';
    }
    echo '</ul>';
}
?>
 

Ответ №3:

Это действительно простой скрипт, и вам действительно следует узнать больше о том, как PHP и MySQL работают вместе, а не просто просить о помощи. Я опубликую базовый поток, чтобы помочь вам в правильном порядке операций, и ресурсы, которые помогут вам в этом. Для начала я бы рекомендовал прочитать это руководство по Tizag, которое должно помочь вам полностью понять, как эти языки работают вместе.

Запрос SQL для получения необходимых данных

 //Connect to the database
//Query for the data
$sql = "SELECT group, first_name, last_name FROM ... WHERE ..."
$results = mysql_query($sql);
 

Проанализируйте результаты SQL для создания многомерного массива результатов

 while($result = mysql_fetch_assoc($results){
    $array_of_groups[$result["group"]][] = $result;
}
 

Выполните итерацию по массиву результатов, чтобы создать желаемый результат

 foreach($array_of_groups as $group_name => $group){
    //We are now looping groups
    echo("<ul id='$group_name'>");
    foreach($group as $item){
        $item_name = $item["first_name"] . " " . $item["last_name"];
        echo("<li>$item_name</li>");
    }
    echo("</ul>");
}
 

Приведенный выше код непроверен и на самом деле просто часть того, что вам нужно. Вам понадобится приведенный выше тест, чтобы выяснить, какие группы не нужны. Я действительно рекомендую прочитать эту статью Tizag и исправить этот пример кода, чтобы убедиться, что вы понимаете, как это работает в будущем.

Ответ №4:

Я думаю, что было бы лучше иметь три цикла while. ВЫБЕРИТЕ * ИЗ таблицы, ГДЕ ‘Group’ =’Red’, затем ВЫБЕРИТЕ * ИЗ таблицы, ГДЕ ‘Group’ =’Green’, затем ВЫБЕРИТЕ * ИЗ таблицы, ГДЕ ‘Group’ ОТСУТСТВУЕТ (‘Red’, ‘Green’). С каждым результатом поместите их в теги UL.

Например:

 <?php
echo '<ul>';
while($row = mysql_fetch_array($result_Red))
  {
  echo "<li>" . $row['first_name'] . " " .  $row['last_name'] . "</li>";
  }
echo "</ul>";

mysql_close($con);
?>
 

А затем снова для Грина и других. Это может сэкономить больше времени, чем сохранение каждого значения в массив, а затем выполнение цикла foreach для их вызова. Возможно, нет. Попробуйте и узнайте.