Heim > Backend-Entwicklung > PHP-Tutorial > Detaillierte Erläuterung der Array-Paging-Implementierung in PHP (nicht datenbankbasiert)

Detaillierte Erläuterung der Array-Paging-Implementierung in PHP (nicht datenbankbasiert)

藏色散人
Freigeben: 2023-04-10 09:06:01
nach vorne
2168 Leute haben es durchsucht

In täglichen Entwicklungsgeschäftsumgebungen verwenden wir im Allgemeinen MySQL-Anweisungen, um Paging-Funktionen zu implementieren. Allerdings gibt es oft einige Daten, die nicht groß sind, oder die Paging-Funktion wird nur benötigt, um einige in PHP definierte Array-Daten abzurufen.

Zu diesem Zeitpunkt müssen wir die Datenbank tatsächlich nicht jedes Mal abfragen. Wir können alle Daten in einer Abfrage abrufen und dann die Paging-Funktion auf PHP-Codeebene implementieren.

Heute lernen wir einige Funktionstechniken kennen, mit denen diese Fähigkeit erreicht werden kann.

Zuerst bereiten wir noch die Testdaten vor.

$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;
Nach dem Login kopieren

Angenommen, $data sind alle Daten, die aus der Datenbank entnommen wurden, oder die Daten, die wir im PHP-Code fest codiert haben. Dann legen wir $p als empfangenen Anforderungsparameter fest und die aktuell aufgerufene Seite ist die zweite Seite. $currentPage wird verwendet, um die Offset-Korrektur abzufragen. In der Welt der Codeentwicklung beginnen alle Indexindizes bei 0, daher müssen wir die empfangenen Parameter um eins dekrementieren. Natürlich können Sie die vom Frontend übergebenen Parameter auch so einstellen, dass 0 als erste Seite verwendet wird. Ich werde nicht so viel erklären. Ich glaube, dass jeder seine Bedeutung verstehen wird, solange er es formell studiert oder an einem Entwicklungsprojekt teilgenommen hat.

Dann definieren wir die Anzahl der auf der aktuellen Seite angezeigten Informationen $pageSize, dh es werden nur 3 Daten erhalten. Schließlich haben wir den Offset berechnet, der dem Parameter in MySQLs LIMIT ähnelt. Seine Funktion besteht darin, uns mitzuteilen, von welchem ​​Element aus wir mit der Abfrage beginnen sollen, und dann mit $pageSize die Anzahl der Elemente abzufragen. Auf diese Weise können wir die Daten erhalten, die der aktuellen Seite entsprechen. (Es scheint, dass die Prinzipien des Pagings erklärt wurden)

array_slice

Die erste, grundlegendste und gebräuchlichste Paging-Methode ist die Verwendung der Funktion array_slice(). Seine Funktion besteht darin, einen Inhalt aus einem Array abzufangen und ein Array dieses Inhalts zurückzugeben. Die Funktion

var_dump(array_slice($data, $offset, $pageSize));
// array(3) {
//     [0]=>
//     string(1) "D"
//     [1]=>
//     string(1) "E"
//     [2]=>
//     string(1) "F"
//   }
Nach dem Login kopieren

array_slice() erfordert drei Parameter, der zweite Parameter ist der Offset und der dritte Parameter dient der Abfrage mehrerer Daten. Unter diesen ist der dritte Parameter optional. Wenn er nicht ausgefüllt wird, werden alle Daten nach dem aktuell eingestellten Offset angezeigt. Ist es genau das Gleiche wie unsere MySQL-Abfrageanweisung? Ja, sie selbst sind ähnliche Operationen. Die Funktion

array_chunk

array_chunk() gruppiert ein Array basierend auf einem numerischen Parameter, d. h. sie teilt das Array in Unterarrays auf. Wir können den Subarray-Inhalt des angegebenen Indexes basierend auf dem geteilten Array erhalten. Diese Inhalte sind die Daten, die auf der aktuellen Seite angezeigt werden müssen.

$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"
//   }
Nach dem Login kopieren

In diesem Code geben wir den Inhalt des geteilten Arrays aus, und dann brauchen wir die zweite Seite, das sind die Daten mit Index 1. Wir können den erforderlichen Inhalt einfach direkt über das geteilte Array erhalten. Die Verwendung dieser Funktion zum Durchführen von Array-Paging ist sehr einfach und intuitiv und erfordert keine Berechnung des Offsets. Sie können die aktuelle Seite $currentPage und $pageSize direkt verwenden. Es wird dringend empfohlen, diese Funktion zu verwenden Funktion. Machen Sie etwas Ähnliches.

LimitIterator

Das Letzte, was wir lernen müssen, ist die Fähigkeit, eine Iterator-Klasse zum Implementieren von Array-Paging zu verwenden. Dies wird seltener verwendet und wahrscheinlich wissen es nicht viele Leute, aber tatsächlich wurde die LimitIterator-Klasse in PHP5 bereitgestellt .1 . Sein Zweck besteht darin, die Iteration über eine eingeschränkte Teilmenge der Elemente eines Iterators zu ermöglichen. Mit anderen Worten: Wenn unser Code das Iteratormuster verwendet und die Iteratorschnittstelle implementiert, können diese Iteratorklassen diese Klasse für Paging-Vorgänge verwenden.

foreach (new LimitIterator(new ArrayIterator($data), $offset, $pageSize) as $d) {
    var_dump($d);
}
// string(1) "D"
// string(1) "E"
// string(1) "F"
Nach dem Login kopieren

Es sind 3 Instanziierungsparameter erforderlich. Der erste ist ein Iteratorobjekt. Da das Array kein Iteratorobjekt ist, verwenden wir eine ArrayIterator-Instanz, um unsere Array-Daten in ein Iteratorobjekt zu konvertieren. Die letzten beiden Parameter sind der Offset und die Anzahl der Daten. Dies ähnelt der Funktion array_slice(), der Unterschied besteht jedoch darin, dass der Offset-Parameter ebenfalls optional ist. Wenn wir die folgenden optionalen Parameter nicht angeben, werden alle Daten durchlaufen.

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"
Nach dem Login kopieren

Leistung bei falschen Parametern

Als nächstes schauen wir uns an, wie sich diese Vorgänge verhalten, wenn ein Problem mit den Parametern vorliegt, also dem Offset oder der erforderlichen Datengröße. Die Funktion

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) {
// }
Nach dem Login kopieren

array_slice() ist mit Offset-Fehlern kompatibel, indem sie ein leeres Array anzeigt. Wenn die Datenmenge den Standard überschreitet, werden alle Daten nach dem Offset angezeigt.

var_dump($pages[15]);
// NULL
Nach dem Login kopieren

array_chunk() gibt natürlich einen NULL-Wert für Daten zurück, deren Index nicht existiert.

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
Nach dem Login kopieren

LimitIterator gibt Fehlerausnahmeinformationen für Daten mit falschem Offset direkt zurück. Dies ist auch der Vorteil der Verarbeitung im Klassenmodus. Eventuelle Fehler werden in Form von Ausnahmen zurückgegeben, was uns die spätere Verarbeitung von Ausnahmen erleichtert.

Sie können auch andere Tests selbst erkennen, z. B. wenn der Offset 0 oder eine negative Zahl ist und wenn die Datenmenge 0 oder eine negative Zahl ist. Ich werde nicht mehr darüber schreiben. Sie können zunächst anhand Ihres vorhandenen Wissens erraten, welche Ergebnisse erzielt werden, und dann Ihren eigenen Code schreiben, um zu überprüfen, ob die Ergebnisse Ihren Erwartungen entsprechen. (Der Testcode-Link unten enthält einen Test, und das Ergebnis ist, dass es Fallstricke gibt)

总结

一个功能使用了三种方式来实现,这就是代码的魅力。至于哪个好哪个坏我们不多做评价,一切都是以业务为核心来进行选取。类似的功能虽说并不常见,但很多项目里都会遇到,比如说后台用户组管理就会非常常见,一般来说后台用户分组如果不是特别大型的 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
Nach dem Login kopieren

参考文档:

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
Nach dem Login kopieren

推荐学习:《PHP视频教程

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Array-Paging-Implementierung in PHP (nicht datenbankbasiert). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
php
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage