2012-03-19 49 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>"; 
}