Создайте алфавит в PHP только с некоторыми буквами в зависимости от имен в базе данных

У меня есть база данных (SQL) с большим количеством имен, и я хотел бы создать алфавитные кнопки, чтобы было легко ориентироваться. Я нашел много примеров того, как создать алфавит в PHP. Однако я хочу построить алфавит только с допустимыми буквами в зависимости от имен в базе данных.

Например:

В базе данных перечислены: Андерсон, Бересфорд, Донован, Эмерсон, Грэм...

Я бы хотел, чтобы алфавит отображался как: A B D E G ...

(Обратите внимание, что C и F не появляются).

Единственный способ, о котором я могу думать, это

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

Это единственный способ? Или я пропустил более простое решение?

Заранее спасибо.


person cesarcarlos    schedule 28.03.2014    source источник
comment
Вы можете использовать LEFT(colName, 1), чтобы вернуть только первый символ из столбца. Я не уверен, как лучше всего использовать это, чтобы получить только алфавит... может быть, SELECT DISTINCT LEFT(colName, 1) или что-то в этом роде?   -  person Andrew Whatever    schedule 28.03.2014


Ответы (3)


SELECT DISTINCT SUBSTRING(lastname,1,1) 'initial'
FROM people
ORDER BY initial ASC

Имейте в виду, что это строковая операция для каждой строки в базе данных, за которой следует неиндексированная операция сортировки. Когда таблица станет большой, она ухудшится.

person Sammitch    schedule 28.03.2014
comment
OP может захотеть написать функцию array_filter или аналогичную для обработки на стороне PHP, если на БД большая нагрузка. - person James Palawaga; 28.03.2014
comment
Спасибо! Я знал, что должен быть более простой метод. - person cesarcarlos; 28.03.2014
comment
Хотел задать вопрос похожий на тему. Благодарю вас! - person abramlimpin; 04.12.2014

SELECT LEFT(name, 1) AS firstletter 
FROM database 
GROUP BY firstletter
ORDER BY last_name 

Работает на меня.

person Frederik Spang    schedule 28.03.2014

Если ваши имена уже были втянуты в массив, вы можете использовать что-то вроде этого (быстро и грязно, возможно, излишне для того, что вы хотите/нужно, но работает!)...

<?php

$names = array('Anderson','Beresford','Donovan','Emerson','Graham');

$alphabet = array();
$previous_letter = '';

foreach($names as $value) {
  if($value[0] != $previous_letter) {
    $alphabet[] = $previous_letter = $value[0];
  }
}

print_r($alphabet);

?>

Рабочий пример здесь: http://3v4l.org/VT0Rt

person Eeji    schedule 28.03.2014