音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

PHP中的数组分页实现(非数据库)实例讲解
日期:2021-09-06 21:09:16   来源:脚本之家

在日常开发的业务环境中,我们一般都会使用 MySQL 语句来实现分页的功能。但是,往往也有些数据并不多,或者只是获取 PHP 中定义的一些数组数据时需要分页的功能。这时,我们其实不需要每次都去查询数据库,可以在一次查询中把所有的数据取出来,然后在 PHP 的代码层面进行分页功能的实现。今天,我们就来学习一下可以实现这个能力的一些函数技巧。

首先,我们还是准备好测试数据。

$data = [
 'A',
 'B',
 'C',
 'D',
 'E',
 'F',
 'G',
 'H',
 'I',
 'J',
 'K',
];
 
// $p = $_GET['p'];
$p = 2;
$currentPage = $p <= 1 ? 0 : $p - 1;
$pageSize = 3;
$offset = $currentPage * $pageSize;

假设 \$data 就是从数据库中取出的全部数据,或者就是我们写死在 PHP 代码中的数据。然后我们设定 $p 为接收到的请求参数,当前访问的是第二页。$currentPage 是用于查询偏移量的修正,在代码开发的世界中,下标索引都是从0开始的,所以我们需要对接收到的参数进行减一的操作。当然,你也可以设定前端传递的参数就是以 0 为第一页的。这个就不多解释了,相信大家只要正式的学习或者参与过开发项目都会明白它的意思。

然后我们定义了当前页面所显示的信息条数 $pageSize ,也就是只获取 3 条数据。最后,我们计算了一下偏移量,也就是类似于 MySQL 的 LIMIT 中的那个参数。它的作用就是告诉我们从第几条开始查询,然后配合 $pageSize 查询几条。这样我们就可以获得当前页面对应的数据了。(貌似把分页的原理都讲了一下)

array_slice

第一个也是最基础和最常见的分页方式,就是使用 array_slice() 函数来实现。它的作用是从数组中截取出一段内容来并返回这段内容的数组。

var_dump(array_slice($data, $offset, $pageSize));
// array(3) {
//  [0]=>
//  string(1) "D"
//  [1]=>
//  string(1) "E"
//  [2]=>
//  string(1) "F"
// }

array_slice() 函数需要三个参数,第二个参数就是偏移量,第三个参数是查询几条数据。其中,第三个参数是可选的,不填的话就会把当前设定的偏移量之后的数据全部显示出来。是不是和我们的 MySQL 查询语句一模一样。没错,他们本身就是类似的操作。

array_chunk

array_chunk() 函数则是根据一个数值参数将一个数组进行分组,也就是将数组分割成一段一段的子数组。我们就可以根据分割后的数组来获取指定下标的子数组内容,这些内容就是当前的页面需要展示的数据了。

$pages = array_chunk($data, $pageSize);
var_dump($pages);
// array(4) {
//  [0]=>
//  array(3) {
//  [0]=>
//  string(1) "A"
//  [1]=>
//  string(1) "B"
//  [2]=>
//  string(1) "C"
//  }
//  [1]=>
//  array(3) {
//  [0]=>
//  string(1) "D"
//  [1]=>
//  string(1) "E"
//  [2]=>
//  string(1) "F"
//  }
//  [2]=>
//  array(3) {
//  [0]=>
//  string(1) "G"
//  [1]=>
//  string(1) "H"
//  [2]=>
//  string(1) "I"
//  }
//  [3]=>
//  array(2) {
//  [0]=>
//  string(1) "J"
//  [1]=>
//  string(1) "K"
//  }
// }
 
var_dump($pages[$currentPage]);
// array(3) {
//  [0]=>
//  string(1) "A"
//  [1]=>
//  string(1) "B"
//  [2]=>
//  string(1) "C"
// }

这段代码我们输出了分割后的数组内容,然后需要的是第二页也就是下标为 1 的数据,直接通过分割后的数组就可以方便地获取到所需要的内容了。使用这个函数来做数组分页的功能非常地简单直观,而且它不需要去计算偏移量,直接就是使用当前页 $currentPage 和 $pageSize 就可以完成对于数据的分组了,非常推荐大家使用这个函数来进行类似的操作。

LimitIterator

最后我们要学习到的是使用一个迭代器类来实现数组分页的能力,这个使用的就比较少了,估计都没什么人知道,但其实 LimitIterator 类在 PHP5.1 时就已经提供了。它的作用是允许遍历一个 Iterator 的限定子集的元素。也就是说,如果我们的代码中使用了迭代器模式,实现了迭代器接口,那么这些迭代器类都可以使用这个类进行分页操作。

foreach (new LimitIterator(new ArrayIterator($data), $offset, $pageSize) as $d) {
 var_dump($d);
}
// string(1) "D"
// string(1) "E"
// string(1) "F"

它需要的实例化构造参数包含3个,第一个是一个迭代器对象,由于数组不是迭代器对象,所以我们使用 ArrayIterator 实例将我们的数组数据转化为一个迭代器对象。后面两个参数就是偏移量和数据数量了,这个和 array_slice() 函数是类似的,不过不同的是,它的偏移量参数也是可以选的。如果我们不给后面的可选参数的话,那么它将遍历所有的数据。

foreach (new LimitIterator(new ArrayIterator($data)) as $d) {
 var_dump($d);
}
// string(1) "A"
// string(1) "B"
// string(1) "C"
// string(1) "D"
// string(1) "E"
// string(1) "F"
// string(1) "G"
// string(1) "H"
// string(1) "I"
// string(1) "J"
// string(1) "K"

参数错误时的表现

接下来,我们看看如果参数错误,也就是偏移量或者所需的数据量大小有问题的话,这些操作将会有什么样的表现。

var_dump(array_slice($data, $offset, 150));
// array(8) {
//  [0]=>
//  string(1) "D"
//  [1]=>
//  string(1) "E"
//  [2]=>
//  string(1) "F"
//  [3]=>
//  string(1) "G"
//  [4]=>
//  string(1) "H"
//  [5]=>
//  string(1) "I"
//  [6]=>
//  string(1) "J"
//  [7]=>
//  string(1) "K"
// }
var_dump(array_slice($data, 15, $pageSize));
// array(0) {
// }

array_slice() 函数对于偏移量错误的兼容就是展示一个空的数组。而数据量超标的话则会展示所有偏移量之后的数据。

var_dump($pages[15]);
// NULL

array_chunk() 对于下标不存在的数据当然就是返回一个 NULL 值啦。

foreach (new LimitIterator(new ArrayIterator($data), $offset, 150) as $d) {
 var_dump($d);
}
// string(1) "D"
// string(1) "E"
// string(1) "F"
// string(1) "G"
// string(1) "H"
// string(1) "I"
// string(1) "J"
// string(1) "K"
 
foreach (new LimitIterator(new ArrayIterator($data), 15, $pageSize) as $d) {
 var_dump($d);
}
// Fatal error: Uncaught OutOfBoundsException: Seek position 15 is out of range

LimitIterator 则是对于偏移量错误的数据直接返回错误异常信息了。这也是类模式处理的好处,有错误都会以异常的形式进行返回,方便我们对异常进行后续的处理。

其它的测试大家还可以自行检测,比如偏移是 0 或者是负数的情况,数据量是 0 或者是负数的情况。这些我就不多写了,大家可以根据已有的知识先猜想一下结果会是什么样的,然后再自己写代码验证一下结果是符合自己的预期,这样学习的效果会非常棒哦!(在下方测试代码链接中有测试,结果里面是有坑的哦)

总结

一个功能使用了三种方式来实现,这就是代码的魅力。至于哪个好哪个坏我们不多做评价,一切都是以业务为核心来进行选取。类似的功能虽说并不常见,但很多项目里都会遇到,比如说后台用户组管理就会非常常见,一般来说后台用户分组如果不是特别大型的 ERP 项目都不会很多,但有时候也会达到需要分页的程度,这时候,我们就可以考虑考虑使用今天所学的知识来做咯!

测试代码:

github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E4%B8%AD%E7%9A%84%E6%95%B0%E7%BB%84%E5%88%86%E9%A1%B5%E5%AE%9E%E7%8E%B0%EF%BC%88%E9%9D%9E%E6%95%B0%E6%8D%AE%E5%BA%93%EF%BC%89.php

参考文档:

https://www.php.net/manual/zh/function.array-slice.php

https://www.php.net/manual/zh/function.array-chunk.php

https://www.php.net/limititerator

到此这篇关于PHP中的数组分页实现(非数据库)实例讲解的文章就介绍到这了,更多相关PHP中的数组分页实现内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程