[PHP] - Jaki sposób na wygenerowanie linków w paginacji

Witam, mam problem z generowaniem linków do paginacji. Niby wszystko działa, ale robię to poraz pierwszy i myslę, że wybrałem zły sposób - instrukcja switch. Wygląda to mniej więcej tak:

switch($this->_currentPage)
{

    case 1:
        // tu dodaje linki
        // $data = [
        // $this->_createLink()
        // ];
        // this->_fillLinksArr($data);
        break;

    case 2:
        // tu dodaje linki
        // $data ...;
        // this->_fillLinksArr($data);
        break;

    case 3:
        // tu dodaje linki
        // $data ...;
        // this->_fillLinksArr($data);
        break;

    case ($this->_lastPage - 2):
        // tu dodaje linki
        // $data ...;
        // this->_fillLinksArr($data);
        break;

    case ($this->_lastPage - 1):
        // tu dodaje linki
        // $data ...;
        // this->_fillLinksArr($data);
        break;

    case $this->_lastPage:
        // tu dodaje linki
        // $data ...;
        // this->_fillLinksArr($data);
        break;

    default:
        // tu dodaje linki
        // $data ...;
        // this->_fillLinksArr($data);
        break;
}

Niby to działa, ale kod wygląda okropnie. Chcę osiągnąć, cos na wzór forum IP.Board. Głównie mam problem z tym, że np jak jestem na pierwszej stronie, to wyswietlam link do kolejno: 2, 3, następnej, ostatniej strony, z tym że już na drugiej stronie trzeba dodać link do pierwszej, czwartej i poprzedniej. Jak można sobie z tym poradzić, nie używając switcha czy if’ów?

Czemu chcesz się pozbywać if-ów? Dla tego się nie da ich pozbyć, bo masz warunki brzegowe, które musisz rozpatrzeć. Ja bym zrobił to tak, że ten jak to ująłeś brzydki fragment ujął w jakąś funkcję, która otrzyma liczbę stron, obecną stronę i promień, który powinno wyświetlać (jeszcze może jakąś tablicę z url-ami, żeby pod numerek podpiąć konkretny url):

Java, ale powinno być zrozumiałe

private static void print(int totalPages, int currentPageNo, int radius) throws IllegalArgumentException {
	if (currentPageNo < 1 || currentPageNo > totalPages) {
		throw new IllegalArgumentException("Index out of bound.");
	}
	
	// warunek na lewy brzeg
	if (currentPageNo - radius > 2) {
		System.out.print("1 ... ");
		
		for (int i = currentPageNo - radius; i < currentPageNo; i++) {
			System.out.print(i + " ");
		}
		
	} else {
		for (int i = 1; i < currentPageNo; i++) {
			System.out.print(i + " ");
		}
	}
	
	// obecna strona (osobno, bo w HTML pewnie nie będzie klikalna, etc.)
	System.out.print("["+currentPageNo+"]");
	
	// warunek na prawy brzeg
	if (currentPageNo + radius < totalPages - 1) {
		for (int i = currentPageNo + 1; i <= currentPageNo + radius; i++) {
			System.out.print(" " + i);
		}
		
		System.out.print(" ... " + totalPages);
	} else {
		for (int i = currentPageNo + 1; i <= totalPages; i++) {
			System.out.print(" " + i);
		}
	}
		
	// nowa linia
	System.out.println("");
}

Przykłady

public static void main(String[] args) {
	print(15,8,3);
	print(7,4,3);
	print(1,1,10);
	print(11,6,3);
	print(10,3,3);
	print(10,8,3);
}

Wyniki

1 ... 5 6 7 [8] 9 10 11 ... 15
1 2 3 [4] 5 6 7
[1]
1 ... 3 4 5 [6] 7 8 9 ... 11
1 2 [3] 4 5 6 ... 10
1 ... 5 6 7 [8] 9 10

Dziękuje bardzo. Bardzo fajne rozwiązanie.