php数组分页实现方法

在 Web 开发中,我们经常需要使用分页功能。在 PHP 中,我们可以通过数组分页实现这个功能。

PHP数组分页实现方法

在 Web 开发中,我们经常需要使用分页功能。在 PHP 中,我们可以通过数组分页实现这个功能。

实现原理

  1. 获取总记录数和需要显示的页数。
  2. 根据每页显示数和当前页数计算出需要显示的数据在数组中的起始和结束位置。
  3. 使用 array_slice() 函数从原数组中截取出需要显示的数据。
  4. 根据分页需求生成分页导航。

代码示例

<?php
// 假设有一个数组
$data = array(
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'
);
// 每页显示 3 条数据
$perPage = 3;
// 当前页码
$page = isset($_GET['page']) ? $_GET['page'] : 1;
// 总记录数
$total = count($data);
// 总页数
$totalPages = ceil($total / $perPage);
// 计算起始位置
$start = ($page - 1) * $perPage;
// 截取需要显示的数据
$dataForPage = array_slice($data, $start, $perPage);

// 遍历需要显示的数据
foreach ($dataForPage as $value) {
    echo $value . '<br>';
}

// 生成分页导航
echo '<div>';
for ($i = 1; $i <= $totalPages; $i++) {
    if ($i == $page) {
        echo $i . '&nbsp;';
    } else {
        echo '<a href="?page=' . $i . '">' . $i . '</a>&nbsp;';
    }
}
echo '</div>';

以上代码将数组分成了多页,每页最多显示 3 条数据,并且在页面底部生成了分页导航。

更复杂的示例

我们可以扩展上面的示例代码,实现更多复杂的功能,比如:

  • 动态传入需要显示的数据和每页显示的数据条数。
  • 分页导航样式定制。
  • 高级分页功能,可根据当前页码动态生成导航,支持前后页、省略号等。

比如下面的代码示例可以实现上面的功能:

<?php
class Pagination {
    private $total;  // 总记录数
    private $perPage;  // 每页显示数
    private $currentPage;  // 当前页码
    private $totalPages;  // 总页数

    private $urlPattern;  // 分页链接格式
    private $ellipsis;   // 省略号
    private $prevLabel;  // 上一页标签
    private $nextLabel;  // 下一页标签

    public function __construct(
        $total,
        $perPage,
        $currentPage = 1,
        $urlPattern = '?page=%d',
        $ellipsis = '...',
        $prevLabel = '上一页',
        $nextLabel = '下一页'
    ) {
        $this->total = $total;
        $this->perPage = $perPage;
        $this->currentPage = $currentPage;
        $this->urlPattern = $urlPattern;
        $this->ellipsis = $ellipsis;
        $this->prevLabel = $prevLabel;
        $this->nextLabel = $nextLabel;

        $this->totalPages = ceil($this->total / $this->perPage);
    }

    public function getData($data) {
        $start = ($this->currentPage - 1) * $this->perPage;
        return array_slice($data, $start, $this->perPage);
    }

    public function getPagination() {
        $html = '';

        // 上一页
        if ($this->currentPage == 1) {
            $html .= '<span class="disabled">' . $this->prevLabel . '</span>';
        } else {
            $prevUrl = sprintf($this->urlPattern, $this->currentPage - 1);
            $html .= '<a href="' . $prevUrl . '">' . $this->prevLabel . '</a>';
        }

        // 首页
        if ($this->currentPage > 5) {
            $html .= '<a href="' . sprintf($this->urlPattern, 1) . '">1</a>';
            if ($this->currentPage > 6) {
                $html .= '<span>' . $this->ellipsis . '</span>';
            }
        }

        // 中间页码
        $start = $this->currentPage - 3 > 1 ? $this->currentPage - 3 : 1;
        $end = $this->currentPage + 3 < $this->totalPages ? $this->currentPage + 3 : $this->totalPages;
        for ($i = $start; $i <= $end; $i++) {
            if ($i == $this->currentPage) {
                $html .= '<span class="active">' . $i . '</span>';
            } else {
                $html .= '<a href="' . sprintf($this->urlPattern, $i) . '">' . $i . '</a>';
            }
        }

        // 尾页
        if ($this->currentPage < $this->totalPages - 4) {
            if ($this->currentPage < $this->totalPages - 5) {
                $html .= '<span>' . $this->ellipsis . '</span>';
            }
            $html .= '<a href="' . sprintf($this->urlPattern, $this->totalPages) . '">' . $this->totalPages . '</a>';
        }

        // 下一页
        if ($this->currentPage == $this->totalPages) {
            $html .= '<span class="disabled">' . $this->nextLabel . '</span>';
        } else {
            $nextUrl = sprintf($this->urlPattern, $this->currentPage + 1);
            $html .= '<a href="' . $nextUrl . '">' . $this->nextLabel . '</a>';
        }

        return $html;
    }
}

// 假设有一个数组
$data = array(
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'
);

// 每页显示 3 条数据
$perPage = 3;

// 当前页码
$page = isset($_GET['page']) ? $_GET['page'] : 1;

// 总记录数
$total = count($data);

// 实例化 Pagination 类
$pagination = new Pagination(
    $total,
    $perPage,
    $page,
    '?page=%d',
    '...',
    '&lt;',
    '&gt;'
);

// 获取需要显示的数据
$dataForPage = $pagination->getData($data);

// 遍历需要显示的数据
foreach ($dataForPage as $value) {
    echo $value . '<br>';
}

// 显示分页导航
echo $pagination->getPagination();

上面的代码实现了分页导航的各种定制功能。可以通过修改构造函数的参数来实现不同的效果。

总结

PHP 数组分页实现方法简单易懂,基本原理也很简单,只需要一些基础的 PHP 数组处理函数和数学运算即可。在实际开发中,我们可以结合类库或框架来实现更多高级的分页功能。

本文标题为:php数组分页实现方法

基础教程推荐