2012-03-19 101 views
0

我想以有組織,清晰的方式顯示數據庫中的某些元素,但找不到合適的解決方案。比方說,我在DB這些行:蘋果,錨,拍,蓋,同學,窗簾......我需要這樣的顯示出來:PHP - 按第一個字母組排列

A 
apple 
anchor 

B 
beat 

C 
cover 
classmate 
curtain 

因此,有基於第一類分開單獨的div這個詞的信。我可以創建一個帶有mysql查詢的類來選擇像$ char這樣的名稱,其中$ char是一個參數,然後通過A-Z時間重複該類...但我不喜歡這樣,因爲手動工作太多。你有什麼建議嗎?

回答

2

將它們字母化,然後在打印時跟蹤您所在的字母。當您找到一封新信件時,請在繼續之前打印一個新信件。

0

我將使用單個查詢將所有單詞(當然排序)讀取到PHP數組中。然後用一些PHP代碼,可以將它們從數組中拉出來,根據需要插入前導字母'A','B'。

+0

謝謝Jay!你的建議幫助了我。我用一個for來檢查數組,並檢查該項目的第一個字母是否與前一個項目的第一個字母不同。 – Cosmi 2012-03-19 22:21:58

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>"; 
}