php 數(shù)組分頁可通過以下方法實(shí)現(xiàn):數(shù)組切片(array_slice()):根據(jù)偏移量和長(zhǎng)度切分?jǐn)?shù)組。外部迭代器(limititerator):使用迭代器遍歷數(shù)組,設(shè)置偏移量和長(zhǎng)度限制。內(nèi)置函數(shù)(array_chunk()):將數(shù)組分成指定大小的塊。本地實(shí)現(xiàn):自定義函數(shù)實(shí)現(xiàn)分頁算法,包括計(jì)算總頁數(shù)、偏移量和返回分頁后的數(shù)組。
PHP 數(shù)組分頁的實(shí)現(xiàn)方式
分頁是 web 開發(fā)中一個(gè)常見的需求,它可以將大量數(shù)據(jù)分成較小的塊,從而提高頁面加載速度和用戶體驗(yàn)。在 PHP 中,有多種實(shí)現(xiàn)數(shù)組分頁的方法。
數(shù)組切片
這是最簡(jiǎn)單的方法,使用 PHP 的 array_slice()
函數(shù):
// 獲取當(dāng)前頁 $currentPage = (isset($_GET['page'])) ? (int) $_GET['page'] : 1; // 每頁顯示的記錄數(shù) $perPage = 10; // 計(jì)算偏移量 $offset = ($currentPage - 1) * $perPage; // 分頁后的數(shù)組 $paginatedArray = array_slice($array, $offset, $perPage);
登錄后復(fù)制
外部迭代器
PHP 中的標(biāo)準(zhǔn)類庫提供了一個(gè)用于遍歷數(shù)組的 LimitIterator
類:
use IteratorIterator; use LimitIterator; // 創(chuàng)建外部迭代器 $limitIterator = new LimitIterator(new ArrayIterator($array), $offset, $perPage); // 分頁后的數(shù)組 $paginatedArray = []; foreach ($limitIterator as $item) { $paginatedArray[] = $item; }
登錄后復(fù)制
內(nèi)置函數(shù)
PHP 7.1 及更高版本中引入了 array_chunk() 函數(shù),它將數(shù)組分成指定大小的塊:
// 分頁后的數(shù)組 $paginatedArray = array_chunk($array, $perPage);
登錄后復(fù)制
本地實(shí)現(xiàn)
也可以使用函數(shù)來實(shí)現(xiàn)自己的分頁算法:
function paginate(array $array, int $currentPage, int $perPage): array { $totalPages = ceil(count($array) / $perPage); if ($currentPage < 1 || $currentPage > $totalPages) { return []; } $offset = ($currentPage - 1) * $perPage; return array_slice($array, $offset, $perPage); }
登錄后復(fù)制
實(shí)戰(zhàn)案例
假設(shè)我們有一個(gè) $users
數(shù)組,包含 100 個(gè)用戶,現(xiàn)在我們需要在每頁顯示 10 條數(shù)據(jù):
// 獲取當(dāng)前頁 $currentPage = (isset($_GET['page'])) ? (int) $_GET['page'] : 1; // 分頁后的用戶數(shù)組 $paginatedUsers = paginate($users, $currentPage, 10);
登錄后復(fù)制
然后,我們可以在頁面上顯示分頁后的用戶數(shù)據(jù):
<ul> <?php foreach ($paginatedUsers as $user): ?> <li><?php echo $user['name']; ?></li> <?php endforeach; ?> </ul>
登錄后復(fù)制
分頁控制可以根據(jù)需要實(shí)現(xiàn),例如:
<nav aria-label="Pagination"> <ul class="pagination"> <?php if ($currentPage > 1): ?> <li class="page-item"> <a class="page-link" href="<?php echo "?page=" . ($currentPage - 1); ?>">Previous</a> </li> <?php endif; ?> <?php for ($i = 1; $i <= $totalPages; $i++): ?> <li class="page-item <?php echo ($currentPage == $i) ? 'active' : ''; ?>"> <a class="page-link" href="<?php echo "?page=" . $i; ?>"><?php echo $i; ?></a> </li> <?php endfor; ?> <?php if ($currentPage < $totalPages): ?> <li class="page-item"> <a class="page-link" href="<?php echo "?page=" . ($currentPage + 1); ?>">Next</a> </li> <?php endif; ?> </ul> </nav>
登錄后復(fù)制