2014-04-10 2 views
0

У меня <ul> генерируемый из таблицы MySQL БД с этим PHP скрипт:PHP - генерации HTML-элемент для каждого уникального набора значений в массиве

$result = mysqli_query($con,"SELECT * FROM city_list ORDER BY city_state"); 

echo "<ul class=\"chapter-list\">"; 
    while($row = mysqli_fetch_array($result)) 
    { 
    echo "<li data-state=\"" . $row['city_state'] . "\">" . $row['city_name'] . "</li>"; 
    } 
echo "</ul>"; 

Выход выглядит следующим образом:

<ul> 
    <li data-state="alabama">Birmingham</li> 
    <li data-state="alabama">Bear Creek</li> 
    <li data-state="alabama">Belk</li> 
    <li data-state="kansas">Topeka</li> 
    <li data-state="kansas">Olathe</li> 
</ul> 

Я хотел бы создать заголовок как элемент <li> перед каждой группой определенного значения data-state. Таким образом, я хотел бы закончить с разметкой, как это:

<ul> 
    <li>Alabama</li> 
    <li data-state="alabama">Birmingham</li> 
    <li data-state="alabama">Bear Creek</li> 
    <li data-state="alabama">Belk</li> 
    <li>Kansas</li> 
    <li data-state="kansas">Topeka</li> 
    <li data-state="kansas">Olathe</li> 
</ul> 

Есть ли функция массив PHP, чтобы сделать что-то вроде этого, или я, возможно, придется прибегнуть к чему-то с JS? Я прошел через PHP-документы, но пока не нашел решения. Я новичок в PHP, поэтому любое руководство ценится.

+0

Изменить запрос 'SELECT DISTINCT * FROM city_list ORDER BY city_state' , вероятно? –

ответ

0

Вот такой подход. Каждый раз, когда появляется новый $row['city_state'], то если условие будет истинно, и он отзовется новую заголовок:

$last_state = ''; 

while($row = mysqli_fetch_array($result)) 
{ 
    if ($last_state != $row['city_state']){ 
     echo '<li>' . ucfirst($row['city_state']) . '</li>'; 
    } 
    echo '<li data-state="' . $row['city_state'] . '">' . $row['city_name'] . '</li>'; 
    $last_state = $row['city_state']; 
} 
+0

Спасибо [LarsAnders] (http://stackoverflow.com/users/3258572/larsanders) - отлично работает! Является ли '! =', Что делает трюк в вашем коде? – Marcatectura

+0

Да, это и точное место, где мы присваиваем значение '$ last_state'. Это в основном проверка разницы между значением в конце последнего цикла и значением из недавно загруженной строки. В первый раз «$ last_state» не равен новой строке, поэтому первый заголовок печатается. – larsAnders

0

Вы можете сохранить предыдущее значение $row["city_state"] переменной вне цикла в то время, и если проверить новый $row["city_state"] равен старому. Если два значения не равны, вы добавляете элемент, как этот '<li data-state="'.$row["city_state"].'">'."Something".'</li>'

EDIT: код larsAnders' именно то, что я имел в виду :)

Смежные вопросы