PHP - 按第一个字母分组行

时间:2012-03-19 22:08:32

标签: php mysql string select indexing

我试图以有条理和清晰的方式显示我的数据库中的一些元素,但我找不到合适的解决方案。假设我在db中有这些行:apple,anchor,beat,cover,classmate,curtain ...我需要像这样显示它们:

A
apple
anchor

B
beat

C
cover
classmate
curtain

因此,根据单词的第一个字母,有单独的div具有单独的类。我可以创建一个带有mysql查询的类来选择像$ char这样的名字,其中$ char是一个参数,并按A-Z时间重复该类...但我不喜欢这样,因为有太多的手工工作。你有什么建议吗?

4 个答案:

答案 0 :(得分:3)

您希望列表完全按字母顺序排列吗?或者只按第一个字母分组?如果不能开始你的任何单词的字母不显示为标题,你是否在乎?例如,如果你没有任何以'x'开头的单词,你是否还需要看到下面没有任何内容的'X'类别,还是应该从'W'跳到'Y'?

确切的实施可能会根据这些问题的答案而有所不同。这是一个解决方案,应该完全按照alpha顺序显示列表,跳过没有单词的类别。 (不确定你想要什么样的标记;这是非常简单的。)

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

答案 1 :(得分:2)

将它们按字母顺序排列,然后在打印时,跟踪您所写的字母。找到新信后,请在继续之前打印新标题。

答案 2 :(得分:0)

我会使用单个查询将所有单词(当然已排序)读入PHP数组。然后用一些PHP代码将它们从数组中拉出来,根据需要插入前导字母“A”,“B”。

答案 3 :(得分: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";
    }
}