提前联系应用程序的mysql查询问题

时间:2011-07-26 21:15:44

标签: php jquery codeigniter jquery-mobile

我正在制作一个联系人应用程序(使用CodeIgniter和jQuery Mobile),我正在尝试为每组名称插入列表分隔符。

示例:

A
Adam Smith
Alex Smith

B
Beth Smith
Billy Smith

到目前为止,我可以从mysql db:http://dl.dropbox.com/u/19118763/screenshots/before.png

按字母顺序获取名称

代码

<?php
$query = $this->db->query("SELECT * FROM `CONTACTS` ORDER BY `CONTACTS`.`FIRST` ASC LIMIT 0, 100"); 
foreach($query->result() as $row):  
?>

<li><a href="contacts/details/<?=$row->ID?>/index.php" data-rel="dialog" data-transition="slidedown"><?=$row->FIRST?> <?=$row->LAST?></a></li>

<?php endforeach; ?>

但是,一旦我添加以下代码来获取每个名字的第一个字母,我得到以下结果:http://dl.dropbox.com/u/19118763/screenshots/after.png

上面的相同代码除了在foreach中添加了这个

<li data-role='list-divider'><?php echo substr("$row->FIRST",0,1); ?></li>

3 个答案:

答案 0 :(得分:0)

尝试替换与此链接的代码:

<?php
$prevletter = null;
$query = $this->db->query("SELECT * FROM `CONTACTS` ORDER BY `CONTACTS`.`FIRST` ASC LIMIT 0, 100"); foreach($query->result() as $row):  
$letter = substr($row->FIRST, 0, 1);
if ($letter != $prevletter):
$prevletter = $letter;
?>
<li data-role='list-divider'><?=$letter?></li>
<?php endif; ?>
<li><a href="contacts/details/<?=$row->ID?>/index.php" data-rel="dialog" data-transition="slidedown"><?=$row->FIRST?> <?=$row->LAST?></a></li>
<?php endforeach; ?>

那应该做你需要的。

答案 1 :(得分:0)

您需要检查先前是否已输出“第一个字母”,并且只在更改时输出一个字母:

$previous_letter = null; // prime things with an "impossible" letter.

while(...) {
   if ($previous_letter != substr($row->FIRST, 0, 1)) {
       ... ouptut new letter ...
       $previous_letter = new letter...
   }
}

答案 2 :(得分:0)

那是因为你遇到的每一行都是在回应第一个字母。如果第一个字母与最后一个字母不同,您只想回显第一个字母。

伪代码:

$prev = null
foreach (rows as row){
    $curr = substr(row->first, 0, 1)
    if ($prev != $curr){
        echo list-divider
        $prev = $curr;
    }
}