在日常开发的业务环境中,我们一般都会使用 mysql 语句来实现分页的功能。但是,往往也有些数据并不多,或者只是获取 php 中定义的一些数组数据时需要分页的功能。
这时,我们其实不需要每次都去查询数据库,可以在一次查询中把所有的数据取出来,然后在 php 的代码层面进行分页功能的实现。
今天,我们就来学习一下可以实现这个能力的一些函数技巧。
首先,我们还是准备好测试数据。
$data = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',];// $p = $_get['p'];$p = 2;$currentpage = $p 8621a167e528802bcb9fc5203baf42ba// string(1) 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 (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) kforeach (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 项目都不会很多,但有时候也会达到需要分页的程度,这时候,我们就可以考虑考虑使用今天所学的知识来做咯!
测试代码:
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.phphttps://www.php.net/manual/zh/function.array-chunk.phphttps://www.php.net/limititerator
推荐学习:《php视频教程》
以上就是详解php中的数组分页实现(非数据库)的详细内容。