首先,我们还是准备好测试数据。
$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)34;D"//[1]=>//string(1)"E"//[2]=>//string(1)"F"//}
array_slice() 函数须要三个参数,第二个参数便是偏移量,第三个参数是查询几条数据。个中,第三个参数是可选的,不填的话就会把当前设定的偏移量之后的数据全部显示出来。是不是和我们的 MySQL 查询语句千篇一律。没错,他们本身便是类似的操作。
array_chunkarray_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(newLimitIterator(newArrayIterator($data),$offset,$pageSize)as$d){var_dump($d);}//string(1)"D"//string(1)"E"//string(1)"F"
它须要的实例化布局参数包含3个,第一个是一个迭代器工具,由于数组不是迭代器工具,以是我们利用 ArrayIterator 实例将我们的数组数据转化为一个迭代器工具。后面两个参数便是偏移量和数据数量了,这个和 array_slice() 函数是类似的,不过不同的是,它的偏移量参数也是可以选的。如果我们不给后面的可选参数的话,那么它将遍历所有的数据。
foreach(newLimitIterator(newArrayIterator($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(newLimitIterator(newArrayIterator($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(newLimitIterator(newArrayIterator($data),15,$pageSize)as$d){var_dump($d);}//Fatalerror:UncaughtOutOfBoundsException:Seekposition15isoutofrange
LimitIterator 则是对付偏移量缺点的数据直接返回缺点非常信息了。这也是类模式处理的好处,有缺点都会以非常的形式进行返回,方便我们对非常进行后续的处理。
其它的测试大家还可以自行检测,比如偏移是 0 或者是负数的情形,数据量是 0 或者是负数的情形。这些我就不多写了,大家可以根据已有的知识先猜想一下结果会是什么样的,然后再自己写代码验证一下结果是符合自己的预期,这样学习的效果会非常棒哦!
(不才方测试代码链接中有测试,结果里面是有坑的哦)
一个功能利用了三种办法来实现,这便是代码的魅力。至于哪个好哪个坏我们不多做评价,统统都因此业务为核心来进行选取。类似的功能虽说并不常见,但很多项目里都会碰着,比如说后台用户组管理就会非常常见,一样平常来说后台用户分组如果不是特殊大型的 ERP 项目都不会很多,但有时候也会达到须要分页的程度,这时候,我们就可以考虑考虑利用本日所学的知识来做咯!
测试代码:
https://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