php数组转换成字符串-PHP中的字段分页实现(非数据库)

2023-08-29 0 7,605 百度已收录

在日常开发的业务环境中,我们通常会使用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开始php数组转换成字符串,因此我们需要将接收到的参数减一。 其实你也可以通过设置后端传递的参数来使用0作为首页。 这个我就不多解释了,相信只要你即将学习或者参与过开发项目就会明白这意味着什么。

之后我们定义了$pageSize,即当前页面显示的信息条数,即只获取了3条数据。 最后我们估计了倾斜量,这个和MySQL的LIMIT中的参数类似。 它的作用是告诉我们从哪一项开始查询,然后配合$pageSize查询多少项。 这样我们就可以获取到当前页面对应的数据了。 (看来分页的原理已经解释过了)

数组切片

php数组转换成字符串-PHP中的字段分页实现(非数据库)

第一种也是最基本且常见的分页方法是使用 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()函数根据数值参数对链表进行分组,即将链表划分为子链表。 我们可以根据划分的链表获取指定下标的子链表的内容,这就是当前页面需要显示的数据。

php数组转换成字符串-PHP中的字段分页实现(非数据库)

$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来完成数据的分组。 强烈建议您使用此功能。 做类似的事情。

限制迭代

我们最后要学习的是能够使用迭代器类来实现链表的分页。 这个很少用php数组转换成字符串,恐怕没人知道,但毕竟PHP5.1中已经提供了LimitIterator类。 它的作用是允许遍历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) {
// }

php数组转换成字符串-PHP中的字段分页实现(非数据库)

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直接返回倾斜量错误的数据的错误异常信息。 这也是利用class模式处理。 如果出现错误,就会以异常的方式返回,方便我们对异常进行后续处理。

你也可以自己检查其他测试,比如当skew为0或正数时,以及当数据量为0或正数时。 我不会写更多关于这些的内容。 你可以根据现有的知识推测结果会是什么,然后自己编写代码来验证结果是否符合你的期望。 这样学习的效果一定会很好! (下面的测试代码链接中有测试,结果有坑)

总结

一个函数是用三种形式来实现的,这就是代码的魅力。 至于哪个好哪个不好,我们不做太多评价,一切以业务为核心来选择。 类似的功能其实并不常见,但是在很多项目中都会遇到。 比如后台用户组管理就很常见。 一般来说,如果后台用户群不是一个很小的ERP项目的话,数量不会很多,但有时会达到需要分页的地步。 这个时候我们就可以考虑用明天学到的知识去做了!

测试代码:

%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

参考文件:

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php数组转换成字符串-PHP中的字段分页实现(非数据库) https://www.wkzy.net/game/172840.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务