Предварительный вопрос MySQL для контактного приложения - PullRequest
0 голосов
/ 27 июля 2011

Я создаю приложение для контактов (с CodeIgniter и jQuery Mobile), и сейчас я пытаюсь вставить разделители списка для каждой группы имен.

Пример:

A
Adam Smith
Alex Smith

B
Beth Smith
Billy Smith

Пока что я могу получить имена в алфавитном порядке из базы данных mysql: 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 голосов
/ 27 июля 2011

Вам необходимо проверить, была ли ранее выведена «первая буква», и выводить букву только при ее изменении:

$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...
   }
}
0 голосов
/ 27 июля 2011

Это потому, что для каждого ряда, с которым вы сталкиваетесь, вы повторяете первую букву. Вы хотите отобразить первую букву, только если она отличается от последней первой буквы.

псевдокод:

$prev = null
foreach (rows as row){
    $curr = substr(row->first, 0, 1)
    if ($prev != $curr){
        echo list-divider
        $prev = $curr;
    }
}
0 голосов
/ 27 июля 2011

Попробуйте заменить код, который вы связали, следующим:

<?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; ?>

Это должно сделать то, что вам нужно.

...