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 31654eb269674262d5f7c412c865c920 // string(1) "D" // [1]=> // string(1) "E" // [2]=> // string(1) "F" // }
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" // }
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"
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"
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) { // }
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
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
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
参考文档:
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视频教程》