БлогNot. PHP: как сделать алфавитный указатель

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

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

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

Ниже показано одно из возможных решений, не зависящее от внешних модулей. Все данные передаются в функцию getAlphabeticalIndex, выполняющую поключение к базе с помощью стандартного класса PDO. Функция возвращает сформированный контент указателя. Дополнительные комментарии есть в листинге.

<?php
 $content = getAlphabeticalIndex 
  ('database', 'localhost', 'root', 'root', 'table', 'field', 'http://url.com/script.php?id=', 'id');
 //Укажите аргументами функции правильные данные подключения: 
  //база данных, 
  //хост, 
  //логин, 
  //пароль, 
  //название таблицы с данными, 
  //поле для сортировки в таблице с данными,
  //URL для формирование ссылок,
  //поле идентификатора в таблице с данными
 echo $content;

 function getAlphabeticalIndex ($dbname,$host,$login,$password,$table,$fieldOrder,$link,$fieldId) {
  $data = [];
  $en = [
   'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
   'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
  ];	
  $ru = [
   'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л',
   'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш',
   'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я'
  ];
  $dbh = new PDO("mysql:dbname=$dbname;host=$host", $login, $password);
  $sth = $dbh->prepare("SELECT *, UPPER(LEFT(`name`, 1)) AS `letter` FROM `$table` ORDER BY `$fieldOrder`");
  $sth->execute();
  $list = $sth->fetchAll(PDO::FETCH_ASSOC);
  // Компонуем массив в виде буква => записи
  $data = [];
  foreach ($list as $list_row) {
   foreach ($en as $row) {
    if ($list_row['letter'] == $row) $data[$row][] = $list_row;	
   }
   foreach ($ru as $row) {
    if ($list_row['letter'] == $row) $data[$row][] = $list_row;	
   }
  }
  //Формируем верхнее оглавление
  $result = "<div class=\"pointer\">\n";
  foreach ($en as $row) {
   if (empty($data[$row])) $result .= '<span>' . $row . '</span>';
   else $result .= '<a href="#' . $row . '">' . $row . '</a>';
  }
  $result .= "</div>\n";
  $result .= "<div class=\"pointer\">\n";
  foreach ($ru as $row) {
   if (empty($data[$row])) $result .= '<span>' . $row . '</span>';
   else $result .= '<a href="#' . $row . '">' . $row . '</a>';
  }
  $result .= "</div>\n";
  //Формируем алфавитный индекс
  foreach ($data as $i => $items) {
   if (!empty($items)) {
    $items = array_chunk($items, ceil(count($items) / 5));
    $result .= "<h5 id=\"$i\">$i</h5>\n";
    $result .= "<table class=\"list\">\n <tr>\n";
    foreach ($items as $item) {
     $result .= "  <td>\n   <ul>\n";
     foreach ($item as $row) {
      $result .= "    <li><a href=\"$link{$row[$fieldId]}\">{$row['name']}</a></li>\n";
     }
     $result .= "   </ul>\n  </td>\n";
    }
    $result .= " </tr>\n</table>\n";
   }
  }
  return $result;
 }
?>

Применялись следующие стили CSS:

<style>
/* Навигация */
.pointer {
 margin-bottom: 10px;
 font-size: 16px;
}
.pointer a { /* активная буква */
 display: inline-block;
 padding: 3px;
 font-weight: 500;
 color: #36f;
 text-decoration: none;
}
.pointer span { /* неактивная буква */
 display: inline-block;
 padding: 3px;
 color: #300;
}
/* Список */
.list td {
 width: 120px;
 padding: 5px;
 vertical-align: top;
}
.list ul {
 padding: 0;
 margin: 0 0 0 10px;
}
.list ul li {
 padding: 0;
 margin: 0 0 3px 0;
}
.list ul li a { /* ссылка в алфавите */
 color: #18e;
 font-size: 16px;
 text-decoration: none;
}
</style>

 Код функции в работе, на примере списка тегов моего блога

15.09.2022, 14:37 [344 просмотра]


теги: textprocessing программирование список php mysql

К этой статье пока нет комментариев, Ваш будет первым