2012-03-19 11 views
0

データベースからいくつかの要素を整理して明確に表示しようとしていますが、適切な解決策を見つけることができません。のは、私がDBにこれらの行があるとしましょう:リンゴ、アンカー、ビート、カバー、同級生、カーテンが...私は、このようにそれらを表示する必要があります。PHP - 最初の文字で行をグループ化する

A 
apple 
anchor 

B 
beat 

C 
cover 
classmate 
curtain 

だから、最初に基づいて別々のクラスを持つ別のdiv要素があります言葉の手紙$ charのような名前を選択するmysqlクエリを持つクラスを作成することができます。$ charはパラメータであり、A-Z時間でクラスを繰り返します...しかし、手作業が多すぎるので、これは嫌です。何か提案はありますか?

答えて

2

これらをアルファベット順に並べ替えると、印刷中にどの文字が表示されているかを把握できます。新しい手紙を見つけたら、先に進む前に新しいヘッダーを印刷してください。

0

すべての単語(ソートされた、もちろん)をPHP配列に読み込むために単一のクエリを使用します。次に、PHPコードを少し使って配列から取り出し、必要に応じて先頭の文字 'A'、 'B'を挿入します。

+0

ありがとうございました!あなたの提案は私を助けました。 forを使って配列を調べ、アイテムの最初の文字が前のアイテムの最初の文字と異なるかどうかを確認します。 – Cosmi

0

これがうまくいくはずです。

<?php 
$words = $db->query("select word from table order by word")->fetchAll(PDO::FETCH_COLUMN); 
$groups = array(); 

foreach($words as $word) { 
    $groups[$word[0]][] = $word; 
} 

foreach(range('a', 'z') as $c) { 
    echo $c . "\n"; 
    foreach($words[$c] as $word) { 
     echo $word . "\n"; 
    } 
} 
3

リストを完全にアルファベット順にしたいですか?それとも、最初の手紙でグループ分けされていますか?あなたの言葉が始まっていない手紙が見出しとして表示されない場合は気になりますか?たとえば、「x」で始まる単語がない場合は、「X」カテゴリに何も表示されていないか、「W」から「Y」にスキップする必要がありますか?

正確な実装は、これらの質問に対する回答によって異なる場合があります。ここでは、アルファベット順にリストを表示し、その中に単語のないカテゴリをスキップするソリューションがあります。 (あなたがしたいマークアップの種類はわかりません;これはかなり裸の骨です)。

$result = mysql_query("SELECT col FROM table ORDER BY col"); 
$lastFoundLetter = ''; 
while($row = mysql_fetch_array($result)) { 
    //get the first letter of the current record 
    $firstLetter = substr($row['col'], 0, 1); 
    if ($firstLetter != $lastFoundLetter) { 
     //you've started a new letter category 
     if ($lastFoundLetter != '') { 
      //if there's a real value in $lastFoundLetter, we need to close the previous div 
      echo "</div>"; 
     } 
     echo "<div id='" . strtoupper($firstLetter) . "'>"; 
     echo strtoupper($firstLetter) . "<br/>"; 
     $lastFoundLetter = $firstLetter; 
    } 
    echo $row['col']. "<br/>"; 
} 
//close the last div 
if ($lastFoundLetter != '') { 
    echo "</div>"; 
} 
関連する問題