#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 для их вызова. Возможно, нет. Попробуйте и узнайте.