最初・最後へ移動できるCSVページネーションを作る方法【PHP/HTML/CSS・サンプルコード付き】

ページネーション

最初・最後へ移動できるCSVページネーションを作る方法

最初・最後へ移動できるCSVページネーションを作る方法を紹介します。CSVファイルに保存した社員データをPHPで読み込み、1ページごとに一定件数ずつ表示しながら、ページ番号に加えて「最初」「最後」ボタンで先頭ページや最終ページへ移動できるサンプルです。

このサンプルでは、CSVの社員データを1ページ10件ずつ表示します。現在のページ番号をPHPで取得し、表示開始位置を計算して、該当するデータだけをテーブルに出力します。ページ数が多い一覧でも、「最初」「最後」ボタンを使うことで目的の端のページへすばやく移動できます。

社員一覧、顧客一覧、商品一覧など、件数の多いCSVデータを扱う一覧画面に向いています。ページ番号だけでは移動しにくい場合でも、先頭・末尾への移動ボタンを追加することで、より使いやすいページネーションになります。

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

デモ

社員一覧

社員番号 氏名 部署 役職 出身地
1001 山田 太郎 営業部 主任 東京都
1002 佐藤 花子 営業部 一般 神奈川県
1003 鈴木 一郎 営業部 係長 大阪府
1004 高橋 美咲 営業部 一般 愛知県
1005 田中 健 営業部 課長 福岡県
1006 伊藤 彩 営業部 一般 北海道
1007 渡辺 翔 営業部 主任 宮城県
1008 中村 優 営業部 一般 京都府
1009 小林 誠 営業部 係長 兵庫県
1010 加藤 愛 営業部 一般 広島県

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

<?php

// CSVファイル名
$csv_file = 'data.csv';

// 1ページに表示する件数
$per_page = 10;

// 現在のページ番号を取得
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;

// ページ番号が1未満の場合は1に戻す
if ($page < 1) {
    $page = 1;
}

// 社員データを入れる配列
$employees = [];

// CSVファイルを開く
if (($handle = fopen($csv_file, 'r')) !== false) {

    // 1行目の見出し行を読み飛ばす
    fgetcsv($handle);

    // CSVを1行ずつ読み込む
    while (($row = fgetcsv($handle)) !== false) {
        $employees[] = $row;
    }

    // CSVファイルを閉じる
    fclose($handle);

}

// 総件数
$total_count = count($employees);

// 総ページ数
$total_pages = (int)ceil($total_count / $per_page);

// 現在ページが総ページ数を超えた場合は最後のページへ戻す
if ($total_pages > 0 && $page > $total_pages) {
    $page = $total_pages;
}

// 表示開始位置
$offset = ($page - 1) * $per_page;

// 現在のページに表示するデータだけ取得
$page_employees = array_slice($employees, $offset, $per_page);

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

  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>最初・最後へ移動できるCSVページネーション</title>
  <link rel="stylesheet" href="style.css">

</head>
<body>

  <div class="csv-pagination_wrap">

    <h1 class="csv-pagination_title">社員一覧</h1>

    <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_employees as $employee): ?>

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

          <?php endforeach; ?>

        </tbody>

      </table>

    </div>

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

      <?php if ($page > 1): ?>
        <a href="?page=1">最初</a>
        <a href="?page=<?= $page - 1 ?>">前へ</a>
      <?php endif; ?>

      <?php for ($i = 1; $i <= $total_pages; $i++): ?>

        <?php if ($i === $page): ?>
          <span class="csv-pagination_current"><?= $i ?></span>
        <?php else: ?>
          <a href="?page=<?= $i ?>"><?= $i ?></a>
        <?php endif; ?>

      <?php endfor; ?>

      <?php if ($page < $total_pages): ?>
        <a href="?page=<?= $page + 1 ?>">次へ</a>
        <a href="?page=<?= $total_pages ?>">最後</a>
      <?php endif; ?>

    </nav>

  </div>

</body>
</html>

ファイル構成と設置方法

このサンプルはPHP・CSS・CSVの3ファイルで構成されています。PHPでCSVファイルを読み込み、1ページごとに表示する社員データを切り替えます。CSSは一覧表とページネーションのデザインを担当し、CSVには表示する社員データを保存します。

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

sampleフォルダごとPHPが利用できるサーバーへ設置してください。ブラウザからsample/index.phpへアクセスすると、CSVファイルに保存された社員データが1ページ10件ずつ表示されます。表示件数を変更したい場合はindex.php内の$per_page、社員データを変更したい場合はdata.csvを編集してください。


コメント