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

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

藏色散人
藏色散人앞으로
2021-06-23 09:35:482145검색

일상적인 개발 비즈니스 환경에서는 일반적으로 MySQL 문을 사용하여 페이징 기능을 구현합니다. 그러나 일부 데이터는 크지 않거나 페이징 기능은 PHP에 정의된 일부 배열 데이터를 얻는 데만 필요한 경우가 많습니다.

이제 실제로 매번 데이터베이스를 쿼리할 필요는 없습니다. 하나의 쿼리로 모든 데이터를 가져온 다음 PHP 코드 수준에서 페이징 기능을 구현할 수 있습니다.

오늘은 이 기능을 구현할 수 있는 몇 가지 기능 기술을 배워보겠습니다.

먼저 테스트 데이터를 준비합니다.

$data = [
    'A',
    'B',
    'C',
    'D',
    'E',
    'F',
    'G',
    'H',
    'I',
    'J',
    'K',
];

// $p = $_GET['p'];
$p = 2;
$currentPage = $p 9071799faa662ba72f2349ab25b36e8b
//     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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제