이 글에서는 데이터베이스를 사용하지 않고 PHP에서 배열 페이징을 구현하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
일상 개발 비즈니스 환경에서는 일반적으로 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부터 시작하므로 수신된 매개변수를 1씩 줄여야 합니다. 물론 프런트 엔드에서 전달된 매개변수를 설정하여 0을 첫 번째 페이지로 사용할 수도 있습니다. 자세한 설명은 생략하겠습니다. 정식으로 공부해 보거나 개발 프로젝트에 참여해 본 사람이면 누구나 그 의미를 이해할 수 있을 것입니다.
그런 다음 현재 페이지 $pageSize에 표시되는 정보의 수를 정의합니다. 즉, 3개의 데이터만 가져옵니다. 마지막으로 MySQL의 LIMIT에 있는 매개변수와 유사한 오프셋을 계산했습니다. 그 기능은 쿼리를 시작할 항목을 알려주고 $pageSize를 사용하여 항목 수를 쿼리하는 것입니다. 이런 방식으로 현재 페이지에 해당하는 데이터를 얻을 수 있습니다. (페이징의 원리는 설명한 것 같습니다.)
첫 번째이자 가장 기본적이고 일반적인 페이징 방법은 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() 함수에는 3개의 매개변수가 필요하며, 두 번째 매개변수는 오프셋, 세 번째 매개변수는 여러 데이터 조각을 쿼리하는 것입니다. 그 중 세 번째 매개변수는 선택사항입니다. 작성하지 않을 경우 현재 설정된 오프셋 이후의 모든 데이터가 표시됩니다. MySQL 쿼리 문과 정확히 동일합니까? 예, 그 자체도 비슷한 작업입니다.
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 클래스는 다음에서 소개되었습니다. 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 项目都不会很多,但有时候也会达到需要分页的程度,这时候,我们就可以考虑考虑使用今天所学的知识来做咯!
测试代码:
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
推荐学习:php视频教程
위 내용은 데이터베이스를 사용하지 않고 PHP에서 배열 페이징을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!