2017-01-08 6 views
0

mysqlテーブルから割り当てられたリンクを持つ名前のリストをソートしようとしています。
は、HTMLで次のようになりたいと思います:mysqlテーブルのデータを別の見出しのアルファベット順にソート

<h3>A</h3> 
    <ul> 
     <li>Andrea</li> 
     <li>Arron</li> 
    </ul> 

これまでのところ私はアルファベット順に文字や名​​前を一覧表示することができましたが、私はすべての名前をリストしループを作る方法がわかりません見出しの下に '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>"; 

    ?> 

ありがとうございます。

答えて

1

すべて$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>"; 
2

これを試してみてください:

+0

ですから、反復'$ names'の26回以上?クール。 –

+0

いいえ、一度だけ。 '$ idx'は毎回異なっています。 –

+0

妥当な、良いと思われる。 –

-1

スイッチステートメントを使用します。データベースから渡された文字がAにマッチすると、特定のコードを実行するようになります。データベースから取得したデータから最初の文字を集めてください(このPHP関数strchr(string, charToFind);を使用できます)。switch文を使用して比較してください。

$variable 

switch($variable){ 
case 'A': 
#output here 
break 

case 'a': 
#output here 
break 
} 
0

私が最初にデータを分割します:

  • データ処理および出力があり
  • 分離されています

    $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())。したがって、コードはそれほど複雑ではありません。

注:あなたが少し短くなりPDOで

$firstLetter = mb_strtoupper(mb_substr($row['name'], 0, 1,'UTF8')); 

のようなものを使用する必要があり、マルチバイト文字列と安全のために(最初のループを回避):

$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); 
関連する問題