Skip to content

Instantly share code, notes, and snippets.

@Tenderfeel
Last active September 12, 2019 17:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Tenderfeel/5f381178379dde2dbe60d42989bcd40d to your computer and use it in GitHub Desktop.
Save Tenderfeel/5f381178379dde2dbe60d42989bcd40d to your computer and use it in GitHub Desktop.
<?php
include "./PrevNext.php";
include "./Numbers.php";
//ダミーデータジェネレータ
function createDummy($length) {
$dummy = [];
foreach(array_fill(0, $length, null) as $k => $v) {
$dummy[] = 'Item ' . ($k + 1);
}
return $dummy;
}
$items = createDummy(54); //ダミーデータ
$count = count($items); // データの総数
$perPage = 5; // 1ページあたりのデータ件数
$totalPage = ceil($count / $perPage); // 最大ページ数
$page = empty($_GET['page']) ? 1 : (int) $_GET['page']; // 現在のページ
print "<pre>page:" . $page . "\n";
print "count:" . $count . "\n";
print "perPage:". $perPage . "\n";
print "totalPage:" . $totalPage . "</pre>";
?>
<?php
// ページ番号でデータにフィルタかける
function filterData($page, $perPage, $data) {
return array_filter($data, function($i) use ($page, $perPage) {
return $i >= ($page - 1) * $perPage && $i < $page * $perPage;
}, ARRAY_FILTER_USE_KEY);
}
$filterData = filterData($page, $perPage, $items);
print '<ol>';
foreach ($filterData as $data) {
print '<li>' . $data . '</li>';
}
print '</ol>';
?>
<div>
<?php paging($totalPage, $page); ?>
</div>
<div>
<?php paging2($totalPage, $page); ?>
</div>
<?php
/**
* ページ番号リンクの表示
* @param int $totalPage データの最大件数
* @param int $page 現在のページ番号
* @param int $pageRange $pageから前後何件のページ番号を表示するか
*/
function paging2($totalPage, $page = 1, $pageRange = 2){
// ページ番号
$page = (int) htmlspecialchars($page);
// 前ページと次ページの番号計算
$prev = max($page - 1, 1);
$next = min($page + 1, $totalPage);
$nums = []; // ページ番号格納用
$start = max($page - $pageRange, 2); // ページ番号始点
$end = min($page + $pageRange, $totalPage - 1); // ページ番号終点
if ($page === 1) { // 1ページ目の場合
$end = $pageRange * 2; // 終点再計算
}
// ページ番号格納
for ($i = $start; $i <= $end; $i++) {
$nums[] = $i;
}
//最初のページへのリンク
if ($page > 1 && $page !== 1){
print '<a href="?page=1" title="最初のページへ">« 最初へ</a>';
} else {
print '<span>« 最初へ</span>';
}
// 前のページへのリンク
if ($page > 1) {
print '<a href="?page=1" title="前のページへ">&laquo; 前へ</a>';
} else {
print '<span>&laquo; 前へ</span>';
}
// 最初のページ番号へのリンク
print '<a href="?page=1">1</a>';
if ($start > $pageRange) print "..."; // ドットの表示
//ページリンク表示ループ
foreach ($nums as $num) {
// 現在地
if ($num === $page) {
print '<span class="current">' . $num . '</span>';
} else {
// ページ番号リンク表示
print '<a href="?page='. $num .'" class="num">' . $num . '</a>';
}
}
if (($totalPage - 1) > $end ) print "..."; //ドットの表示
//最後のページ番号へのリンク
if ($page < $totalPage) {
print '<a href="?page='. $totalPage .'">' . $totalPage . '</a>';
} else {
print '<span>' . $totalPage . '</span>';
}
// 次のページへのリンク
if ($page < $totalPage){
print '<a href="?page='.$next.'">次へ &raquo;</a>';
} else {
print '<span>次へ &raquo;</span>';
}
//最後のページへのリンク
if ($page < $totalPage){
print '<a href="?page=' . $totalPage . ' title="最後のページへへ">最後へ »</a>';
} else {
print '<span>最後へ »</span>';
}
// 確認用
print "<pre>current:".$page."\n";
print "next:".$next."\n";
print "prev:".$prev."\n";
print "start:".$start."\n";
print "end:".$end."</pre>";
}
<?php
/**
* 前後ページへのリンク表示
* @param int $totalPage 最大ページ数
* @param int $page 現在のページ番号
*/
function paging($totalPage, $page = 1){
$page = (int) htmlspecialchars($page);
$prev = max($page - 1, 1); // 前のページ番号
$next = min($page + 1, $totalPage); // 次のページ番号
if ($page != 1) { // 最初のページ以外で「前へ」を表示
print '<a href="?page=' . $prev . '">&laquo; 前へ</a>';
}
if ($page < $totalPage){ // 最後のページ以外で「次へ」を表示
print '<a href="?page=' . $next . '">次へ &raquo;</a>';
}
/*確認用*/
print "<pre>current:".$page."\n";
print "next:".$next."\n";
print "prev:".$prev."</pre>";
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment