省略記号(…)付きCSVページネーションを作る方法【PHP/CSV/HTML/CSS・サンプルコード付き】

テーブル
無料ツール
テーブルを自由に作成

行数・列数・枠線・背景色・文字色・セル結合などを設定して、HTMLとCSSを自動生成できます。

テーブル作成ツールを使う
新しいタブで開きます

省略記号(…)付きCSVページネーションを作る方法

省略記号(…)付きCSVページネーションを作る方法を紹介します。このサンプルでは、CSVファイルに保存した100件の社員データをPHPで読み込み、1ページにつき10件ずつテーブルへ表示します。ページ番号が多い場合でもすべての番号を並べるのではなく、先頭側・現在のページ付近・末尾側のページ番号を表示し、その間を省略記号(…)でまとめるページネーションを作成します。

1ページ目では「1 2 3 4 … 8 9 10」のように先頭側と末尾側のページ番号を表示します。途中の5ページ目では「1 … 4 5 6 … 10」のように現在のページと前後のページ番号を表示し、離れている部分を省略記号(…)へ切り替えます。現在のページに合わせて表示内容が自動で変わるため、ページ数が多い場合でもページネーションが横に長くなりにくく、社員一覧や顧客一覧、商品一覧などに利用できます。

PHPではCSVデータの総件数から総ページ数を計算し、現在のページに必要な10件だけを取り出して表示します。さらに現在のページ番号を基準に表示するページ番号を判定し、離れたページ番号の間へ省略記号(…)を表示します。CSVのデータ件数が変わった場合も総ページ数は自動で再計算されます。CSSではテーブルの列幅や余白、背景色、枠線、角丸、ページ番号や省略記号のサイズ、色、間隔などを調整できます。

コードについて 本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。

デモ

社員一覧
社員番号 氏名 部署 役職 出身地

ページ番号をクリックしてください。現在のページに合わせてページ番号の一部が「…」で省略され、社員一覧が10件ずつ切り替わります。

コードをコピーして使おう!

<?php

// =========================================
// 基本設定
// =========================================

// 読み込むCSVファイル
$csv_file = 'data.csv';

// 1ページに表示する件数
// 10を変更すると、1ページに表示する社員数が変わります。
$per_page = 10;

// URLの「?page=」から現在のページ番号を取得します。
// pageが指定されていない場合は1ページ目を表示します。
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;

// 1未満のページ番号が指定された場合は1ページ目に戻します。
if ($page < 1) {
  $page = 1;
}


// =========================================
// CSVデータを読み込む
// =========================================

// 社員データを保存する配列
$rows = [];

// CSVファイルを読み込み専用で開きます。
if (($handle = fopen($csv_file, 'r')) !== false) {

  // 1行目の見出し行を読み込みます。
  $header = fgetcsv($handle);

  // 2行目以降の社員データを1行ずつ読み込みます。
  while (($data = fgetcsv($handle)) !== false) {
    $rows[] = $data;
  }

  // CSVファイルを閉じます。
  fclose($handle);
}


// =========================================
// ページ数を計算する
// =========================================

// CSVに登録されている社員データの総件数
$total_items = count($rows);

// 総件数を1ページの表示件数で割り、総ページ数を計算します。
$total_pages = max(1, (int)ceil($total_items / $per_page));

// 総ページ数より大きなページ番号が指定された場合は最後のページを表示します。
if ($page > $total_pages) {
  $page = $total_pages;
}

// 現在のページで最初に表示するデータ位置を計算します。
// 10件表示の場合、1ページ目は0、2ページ目は10、3ページ目は20になります。
$offset = ($page - 1) * $per_page;

// 現在のページに必要なデータだけを取り出します。
$page_rows = array_slice($rows, $offset, $per_page);


// =========================================
// 表示するページ番号を作成する
// =========================================

// ページネーションへ表示するページ番号と省略記号を保存します。
$pagination_items = [];

// 総ページ数が7ページ以下の場合は、すべてのページ番号を表示します。
if ($total_pages <= 7) {

  for ($i = 1; $i <= $total_pages; $i++) {
    $pagination_items[] = $i;
  }

// 現在のページが1〜4ページ目の場合
// 「1 2 3 4 5 … 最終ページ」の形で表示します。
} elseif ($page <= 4) {

  $pagination_items = [
    1,
    2,
    3,
    4,
    5,
    'dots',
    $total_pages
  ];

// 現在のページが最後から4ページ以内の場合
// 「1 … 最後の5ページ」の形で表示します。
} elseif ($page >= $total_pages - 3) {

  $pagination_items = [
    1,
    'dots',
    $total_pages - 4,
    $total_pages - 3,
    $total_pages - 2,
    $total_pages - 1,
    $total_pages
  ];

// それ以外は現在ページと前後1ページを表示します。
// 「1 … 前ページ 現在ページ 次ページ … 最終ページ」の形になります。
} else {

  $pagination_items = [
    1,
    'dots',
    $page - 1,
    $page,
    $page + 1,
    'dots',
    $total_pages
  ];

}

?>
<!DOCTYPE html>
<html lang="ja">

<head>

  <!-- 文字コード -->
  <meta charset="UTF-8">

  <!-- スマートフォン対応 -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <!-- ページタイトル -->
  <title>省略記号(…)付きCSVページネーション</title>

  <!-- CSSファイル -->
  <link rel="stylesheet" href="style.css">

</head>

<body>

  <!-- 社員一覧全体 -->
  <div class="csv-pagination_demo">

    <!-- タイトル -->
    <div class="csv-pagination_title">
      社員一覧
    </div>

    <!-- 横幅が狭い画面ではテーブル部分を横スクロールできます -->
    <div class="csv-pagination_table-wrap">

      <!-- 社員一覧テーブル -->
      <table class="csv-pagination_table">

        <!-- テーブル見出し -->
        <thead>
          <tr>
            <th>社員番号</th>
            <th>氏名</th>
            <th>部署</th>
            <th>役職</th>
            <th>出身地</th>
          </tr>
        </thead>

        <!-- 現在のページに該当する社員データ -->
        <tbody>

          <?php foreach ($page_rows as $row): ?>

            <tr>
              <td><?= htmlspecialchars($row[0], ENT_QUOTES, 'UTF-8') ?></td>
              <td><?= htmlspecialchars($row[1], ENT_QUOTES, 'UTF-8') ?></td>
              <td><?= htmlspecialchars($row[2], ENT_QUOTES, 'UTF-8') ?></td>
              <td><?= htmlspecialchars($row[3], ENT_QUOTES, 'UTF-8') ?></td>
              <td><?= htmlspecialchars($row[4], ENT_QUOTES, 'UTF-8') ?></td>
            </tr>

          <?php endforeach; ?>

        </tbody>

      </table>

    </div>

    <!-- ページネーション -->
    <nav class="csv-pagination_nav" aria-label="ページネーション">

      <?php foreach ($pagination_items as $item): ?>

        <?php if ($item === 'dots'): ?>

          <!-- 離れているページ番号を省略記号で表示 -->
          <span class="csv-pagination_ellipsis" aria-hidden="true">…</span>

        <?php elseif ($item === $page): ?>

          <!-- 現在表示しているページ -->
          <span
            class="csv-pagination_page csv-pagination_active"
            aria-current="page"><?= $item ?></span>

        <?php else: ?>

          <!-- 移動できるページ番号 -->
          <a
            class="csv-pagination_page"
            href="?page=<?= $item ?>"><?= $item ?></a>

        <?php endif; ?>

      <?php endforeach; ?>

    </nav>

  </div>

</body>
</html>
コードをコピーする場合 使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
A

Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。

InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。

ファイル構成と設置方法

このサンプルはPHP・CSS・CSVの3ファイルで構成されています。PHPでdata.csvに保存された100件の社員データを読み込み、1ページにつき10件ずつテーブルへ表示します。現在のページに応じてページ番号の一部を省略記号(…)へ置き換え、必要なページ番号だけを表示します。CSSでは社員一覧テーブルとページネーションのデザイン、横スクロール、スマートフォン向けの表示調整を行います。

sample/
    ├── index.php
    ├── style.css
    └── data.csv

各ファイルの役割
index.phpはdata.csvを読み込み、現在のページに必要な社員データを取り出してテーブルへ表示するファイルです。CSVの総件数から総ページ数を計算し、現在のページに応じて「1 2 3 4 5 … 10」「1 … 4 5 6 … 10」などのページネーションを生成します。

style.cssは社員一覧テーブルとページネーションのデザインを設定するファイルです。テーブルの列幅、余白、枠線、角丸、背景色、ページ番号のサイズや間隔、現在ページの色、省略記号(…)のサイズなどを変更できます。

data.csvは社員データを保存するCSVファイルです。1行目には「社員番号、氏名、部署、役職、出身地」の見出しを記述し、2行目以降へ表示したいデータを追加します。CSVのデータ件数が変わると、index.phpが総ページ数を自動で計算します。

設置方法・使い方
sampleフォルダへindex.php、style.css、data.csvを配置し、sampleフォルダごとPHPが動作するサーバーへアップロードしてください。ブラウザからsample/index.phpへアクセスすると、data.csvの社員データが1ページにつき10件表示されます。ページ番号をクリックするとURLの?page=2などの値が切り替わり、選択したページの社員データが表示されます。現在のページに合わせてページ番号の一部が省略記号(…)へ自動で切り替わります。

PHPを動かす無料サーバーを準備する場合は、InfinityFreeで無料サーバーを作る方法を参考にしてください。sampleフォルダ内のファイルをサーバーへアップロードする方法は、InfinityFreeのFile Managerの使い方で確認できます。

カスタマイズできる内容
index.phpの$per_page = 10;を変更すると、1ページに表示するデータ件数を変更できます。data.csvでは社員番号、氏名、部署、役職、出身地の内容やデータ件数を変更できます。データを追加・削除すると、その件数を基準に総ページ数が自動で再計算されます。

style.cssでは社員一覧全体の余白、テーブルの列幅、セルの余白、枠線、角丸、背景色、ページ番号の横幅・高さ・間隔・角丸・色、省略記号(…)の表示幅や文字サイズなどを変更できます。

数値調整
index.php
$per_page = 10;
1ページに表示するデータ件数です。10を大きくすると1ページに表示される社員数が増え、小さくすると少なくなります。CSVの総件数とこの値を基準に総ページ数が自動で計算されます。

style.css
padding:40px 20px;
ページ全体の余白です。40pxは上下、20pxは左右の余白です。値を大きくすると画面端との間隔が広がります。

padding:24px;
社員一覧全体の内側余白です。値を大きくするとテーブルと外側との間隔が広がり、小さくすると狭くなります。

font-size:28px;
「社員一覧」タイトルの文字サイズです。値を大きくするとタイトルが大きくなり、小さくすると控えめになります。

min-width:760px;
社員一覧テーブルの最小横幅です。値を大きくするとテーブルが横に広がります。画面幅が不足する場合はテーブル部分を横スクロールできます。

width:110px;・180px・180px・120px・170px
社員番号、氏名、部署、役職、出身地の各列の横幅です。それぞれの値を変更すると対応する列の表示幅を調整できます。

padding:14px 16px;
テーブルセルの内側余白です。14pxは上下、16pxは左右の余白です。値を大きくするとセル内の余白が広がります。

border-radius:18px;
テーブル全体の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。

gap:8px;
ページ番号と省略記号(…)の間隔です。値を大きくすると各項目の間隔が広がり、小さくすると近くなります。

margin-top:24px;
テーブルとページネーションの間隔です。24pxを大きくすると上下の間隔が広がり、小さくすると狭くなります。

min-width:42px;
ページ番号の最小横幅です。値を大きくするとページ番号のボタンが横に広がります。

height:42px;
ページ番号の高さです。値を大きくするとボタンが高くなり、小さくすると低くなります。

padding:0 12px;
ページ番号の左右の内側余白です。12pxを大きくするとページ番号の横幅が広がります。

border-radius:10px;
ページ番号の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。

font-size:18px;
省略記号(…)の文字サイズです。値を大きくすると省略記号が大きくなり、小さくすると小さくなります。

レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%で社員一覧全体を画面幅に合わせ、テーブルにはmin-width:760px;、テーブルを囲む部分にはoverflow-x:auto;を指定しています。そのため、テーブルの横幅を確保できない画面ではテーブル部分だけを横スクロールできます。また、640px以下ではページ全体の余白を24px 12px、社員一覧の余白を16px 0、ページ番号の最小横幅と高さを38pxへ変更し、スマートフォン・タブレット・PCで利用しやすい表示に調整しています。


こちらもおすすめ


コメント