![](/img/trans.png)
[英]Get names data in alphabetical order with section headings in php mysql
[英]Sort data from mysql table in alphabetical order under different headings
我正在嘗試使用來自mysql表的分配鏈接對名稱列表進行排序。
希望它在html中看起來像這樣:
<h3>A</h3>
<ul>
<li>Andrea</li>
<li>Arron</li>
</ul>
到目前為止,我已經能夠按字母順序列出字母和名稱,但是我不知道如何制作一個循環,在“ A”等標題下列出所有以“ A”開頭的名稱。
<?php
$connection = mysqli_connect('localhost', 'root', '', 'database');
$query = "SELECT * FROM users ORDER BY name";
$result = $connection->query($query);
$azRange = range('A', 'Z');
foreach ($azRange as $letter){
echo "<h3>" . $letter . "</h3>";
}
echo "<ul>";
while($row = $result->fetch_array()){
echo "<li><a href=\"" . $row['link'] . "\">" . $row['name'] . "</a></li>";
}
echo "</ul>";
?>
謝謝。
嘗試這個:
<?php
$connection = mysqli_connect('localhost', 'root', '', 'database');
$query = "SELECT * FROM users ORDER BY name";
$result = $connection->query($query);
$names = $result->fetch_all(MYSQLI_ASSOC);
$idx = 0;
$namesCount = count($names);
$azRange = range('A', 'Z');
foreach ($azRange as $letter) {
echo "<h3>" . $letter . "</h3>";
echo "<ul>";
for (; $idx < $namesCount; ++$idx) {
$row = $names[$idx];
if (strtoupper($row['name'][0]) === $letter) {
echo "<li><a href=\"" . $row['link'] . "\">" . $row['name'] . "</a></li>";
} else {
break;
}
}
echo "</ul>";
}
您需要檢查每個$row['name']
首字母並控制此字母的更改。 因此,如果第一個字母為幾行的'A'
,然后已更改為'B'
,這意味着您需要回顯此新字母( B
)。
echo "<ul>";
// init first letter with an empty value
$first_letter = "";
while($row = $result->fetch_array()){
// get first letter of current name
$first_letter_of_name = substr($row['name'], 0, 1);
if ($first_letter_of_name != $first_letter) {
// first letters differ, this
// means that new letter is here
// Echo this new letter
echo '<li>Letter: <b>' . $first_letter . '</b></li>'
// Change flag's value
$first_letter = $first_letter_of_name;
}
echo "<li><a href=\"" . $row['link'] . "\">" . $row['name'] . "</a></li>";
}
echo "</ul>";
我將首先拆分數據:
$query = "SELECT * FROM users ORDER BY name";
$result = $connection->query($query);
$data = array();
while($row = $result->fetch_array()){
$firstLetter = strtoupper($row['name'][0]);
$data[$firstLetter][] = $row;
}
foreach ($data as $letter => $letterData){
echo "<h3>" . $letter . "</h3>";
echo "<ul>";
foreach ($letterData as $row) {
echo '<li><a href="' . $row['link'] . '">' . $row['name'] . '</a></li>';
}
echo "</ul>";
}
我這樣做有兩個原因:
if()
)。 因此,代碼不太復雜。 注意:為了安全使用多字節字符串,您應該使用類似
$firstLetter = mb_strtoupper(mb_substr($row['name'], 0, 1,'UTF8'));
使用PDO會更短(避免第一個循環):
$query = "SELECT UPPER(LEFT(name,1)) as first_letter, u.* FROM users u ORDER BY name";
$data = $connection->query($query)->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_GROUP);
使用switch語句; 這樣,當從數據庫傳遞的字母與A匹配時,運行特定代碼; 注意從數據庫獲取的數據中收集第一個字符(您可以使用此php函數strchr(string, charToFind);
)並使用switch語句進行比較;
$variable
switch($variable){
case 'A':
#output here
break
case 'a':
#output here
break
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.