Алфавитный указатель для сайта

Представленные способы помогут сделать алфавитный список (указатель) разбитый на колонки, для вывода станций метро, производителей, категорий и т.д.

Данные берутся из БД. Важно чтобы при выборке сортировка была по имени: ORDER BY `name`.

У обоих способов есть один недостаток – колонки будут разной длины в зависимости от количества строк в каждой букве.

1

Способ 1: на основе PHP

$cols_number = 4; // Количество колонок
$rows = DB::getAll("SELECT * FROM `metro` ORDER BY `name`");

$res = $capital = '';
$cutter = $cut = ceil(count($rows) / $cols_number);
foreach ($items as $i => $row) {
	$firstletter = mb_substr($row['name'], 0, 1);
	if ($firstletter != $capital) {
		if ($i > $cutter) {
			$res .= '</td><td>';
			$cutter = $cutter + $cut;
		}
		$capital = $firstletter;
		$res .= '<div class="liter">' . $capital . '</div>';
	}
	$res .= '<div class="link"><a href="#.html">' . $row['name'] . '</a></div>';
}
PHP
<table class="lettr_list">
	<tr>
		<td>
			<?php echo $res; ?>
		</td>
	</tr>
</table>
HTML
2

Способ 2: на основе БД

$rows = DB::getAll("SELECT *, UPPER(LEFT(`name`, 1)) AS `letter` FROM `metro` ORDER BY `name`");
$rows = array_chunk($rows, ceil(count($rows) / 4));
$letter = '';
PHP
<table class="lettr_list">
	<tr>
		<?php foreach ($rows as $item): ?>
		<td>
			<?php foreach ($item as $row): ?>
			<?php if ($letter != $row['letter']): ?>
			<div class="liter"><?php echo $letter = $row['letter']; ?></div>
			<?php endif; ?>
			<div class="link">
				<a href="#"><?php echo $row['name']; ?></a>
			</div>
			<?php endforeach; ?>
		</td>
		<?php endforeach; ?>
	</tr>
</table>
HTML
30.10.2016, обновлено 27.08.2019 1752

Поделится

Другие публикации

Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
Класс значительно упрощает работу с PDO, сокращает код. Реализован на статических классах и не требует создание...
В продолжении статьи о верстки рейтинга, рассмотрим PHP-скрипты системы отзывов и рейтинга в интернет-магазине.
Часто на сайтах возникает необходимость вставлять в тексты страниц информационные блоки - баннеры, телефоны и т.д. Как...