Hi!
Übrigens: Eingangsparameterprüfungen solltest du auch nicht vergessen. $_GET[p] kann alles mögliche und unmögliche enthalten. Damit es im gültigen Wertebereich landet, kann man wiederum mit min/max arbeiten. Nebeneffakt ist, dass es nun auch garantiert eine Zahl ist, zur Not 0.
$p = max(0, min($pnb, $_GET['p'])); // 0 <= $_GET['p'] <= $pnb
Da du nicht darauf eingegangen bist, nehme ich mal an, dass du von 0 zu zählen beginnst, schon weil es einfacher zu rechnen ist.
Und: p soll ein String sein und keine Konstante, also notiere ihn lieber wie einen String in Anführungszeichen.
Ich habe es jetzt genauso gemacht wie du es gesagt hast.
Nö, nicht ganz.
$start = min(3, $pnb - $_GET[p]);
Damit rechnest du erst die Differenz zum rechten Rand aus. Der Korrekturwert für die linke Seite ergibt sich erst aus 3 minus der Differenz. Zusammen mit dem rechten Korrekturwert wäre das:
$korrektur_links = 3 - min(3, $pnb - $p);
$korrektur_rechts = max(0, 3 - $p);
Die Korrekturwerte sind jeweils zu den 3 nach links und rechts dazuzurechnen. Dann erst hast du den Anfangs- und Endwert beim Blättern.
Nun kann es noch den Fall von weniger als 7 Seiten geben, bei dem die aktuelle sich so in einer mittleren Position befindet, dass inklusive der Korrkturwerte am Ende die Seiten von kleiner als 0 bis größer als $pnb gehen. Dieses Problem lässt sich lösen, indem du mit dem min/max-Trick den linken und rechten Rand wieder einfängst.
Lo!