> 백엔드 개발 > PHP 튜토리얼 > PHP(비데이터베이스)의 배열 페이징 구현에 대한 자세한 설명

PHP(비데이터베이스)의 배열 페이징 구현에 대한 자세한 설명

藏色散人
풀어 주다: 2023-04-10 09:06:01
앞으로
2172명이 탐색했습니다.

일상적인 개발 비즈니스 환경에서는 일반적으로 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

첫 번째로 가장 기본적이고 가장 많이 사용되는 페이징 방법은 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

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 项目都不会很多,但有时候也会达到需要分页的程度,这时候,我们就可以考虑考虑使用今天所学的知识来做咯!

测试代码:

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
로그인 후 복사

推荐学习:《PHP视频教程

위 내용은 PHP(비데이터베이스)의 배열 페이징 구현에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿