Bei $ersteSeite konnte man relativ einfach mit einer booleschen Variable hantieren, die man auf true setzt und nach dem ersten Durchlauf auf false. Mit der letzten Seite ist das nicht ganz so leicht. Was Du gebaut hast, ist eine Art "$folgeSeite" Schalter, der ab der 2. Seite auf true steht.
Du bist auf der letzten Seite, wenn bei der nächsten Schleifen-Runde die while-Bedingung nicht mehr erfüllt sein wird. Du musst also das NÄCHSTE $i mit der Anzahl der Zeilen vergleichen.
Das nächste $i berechnet sich als $i+$len
. Eine Variable $letzteSeite brauchst Du nicht, du kannst den Vergleich direkt da durchführen wo du jetzt $letzteSeite übergibst. Die Details auszuknobeln überlasse ich Dir, das schaffst Du.
Dass Du noch jede Menge mehr Variablen hast, die Du ins Template einbauen musst, ok, das ist jetzt eine neue Information. Du kannst das so machen, wie TS angedeutet hat - du kannst Dir aber auch überlegen, ob Du den bisherigen Ansatz und seinen Vorschlag mischst. MEIN Geschmack wäre es, technische und fachliche Parameter zu trennen. D.h. die Parameter für Zeilennummer, Erste und letzte Seite würde ich auf jeden Fall separat halten. Entweder als einzelne Parameter, oder du gruppierst sie zu einem $steuerung Array. Es gibt viele Wege, die Dich zur Druckerei führen. (Siehe bei Tolkien: Die Straße schreitet fort und fort...).
Bei größeren Datenmengen in Arrays musst Du noch im Hinterkopf haben, dass PHP ein Array als Wert übergibt, d.h. eine Kopie macht. Das kostet Zeit und Speicher. Die Kopie sparst Du Dir, wenn Du die Arrays als Referenzparameter definierst. Das macht man, indem man im Funktionskopf ein & vor den Paramter schreibt, z.B. so: function dingsFunc(&$refParm) { ... }
.
Vorteil: Du sparst Laufzeit und Speicher Nachteil 1: Wenn Du jetzt etwas an den Inhalten des übergebenen Arrays änderst, sind die Änderungen auch außerhalb der Funktion sichtbar. Das kann in Deinem Sinne sein, oder auch nicht. Du musst es nur wissen und entsprechend programmieren. Nachteil 2: Ein Funktionsergebnis (wie das von array_slice) direkt an einen Referenzparameter zu übergeben funktioniert zwar, aber PHP haut Dir eine Notice um die Ohren, im Sinne von "Lass das besser". Dem stimme ich zu, du solltest bei Einsatz eines $data Arrays auf jeden Fall die auszugebenden Zeilen in einem Array-Eintrag $data['rows'] speichern und nur das $data Array als Referenz übergeben.
Von Objektorientierung will ich jetzt lieber nicht anfangen, auch wenn man damit die Lösung deutlich schicker hinbekäme. Wenn Du Dich mit OOP noch nicht beschäftigt hast, wird das jetzt zu viel.
Rolf