簡體   English   中英

在不同標題下按字母順序對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM