<?php
class navigation{
	
	var $iTotal;
	var $iPerPage;
	var $iPageNumber;
	var $sGet;
	var $sGetExtra;
	var $aPage		= array();
	var $bReturn	= false;
	
	function navigation($iTotal, $iPerPage, $sPageNumber = 'page'){
		
		$this->iTotal		= $iTotal;
		$this->iPerPage		= $iPerPage;
		$this->iPageNumber	= (int)((isset($_GET[$sPageNumber]) && is_numeric($_GET[$sPageNumber]) && $_GET[$sPageNumber] > 0) ? $_GET[$sPageNumber] : 1);
		$this->sGet			= $sPageNumber;
		
		unset($_GET[$sPageNumber]);
		
		$aGet = array();
		
		foreach($_GET as $sKey => $sVal){
			
			$aGet[] = $sKey.'='.$sVal;
		}
		
		$this->sGetExtra	= implode($aGet, '&').((count($aGet) > 0) ? '&' : '');
		
		return true;
	}
	
	function return_navigation(){
		
		$aPage		= array();
		
		// Go to first & go to previous
		$aPage['first'] = 
			array(
				'link'		=> (($this->iPageNumber > 1) ? true : false),
				'number'	=> 1
			);
			
		$aPage['prev'] = 
			array(
				'link'		=> (($this->iPageNumber > 1) ? true : false),
				'number'	=> ($this->iPageNumber-1)
			);
		
		// Other page numbers
		$iMax = ceil($this->iTotal/$this->iPerPage);
		
		for($iNumb = 1; $iNumb <= $iMax; $iNumb++){
			
			$aPage['numbers'][($iNumb-1)] = 
				array(
					'link'		=> (($iNumb == $this->iPageNumber) ? false : true),
					'number'	=> $iNumb
				);
		}
		
		// Go to last & go to next
		$aPage['last'] = 
			array(
				'link'		=> (($this->iPageNumber < $iMax) ? true : false),
				'number'	=> $iMax
			);
			
		$aPage['next'] = 
			array(
				'link'		=> (($this->iPageNumber < $iMax) ? true : false),
				'number'	=> ($this->iPageNumber+1)
			);
		
		$this->aPage	= $aPage;
		$this->bReturn	= true;
		
		return $aPage;
	}
	
	function show_navigation(){
		
		if($this->bReturn === false){
			
			$this->return_navigation();
		}
		
		// Link for first
		if($this->aPage['first']['link'] === true){
			
			$sReturn = '<a href="?'.$this->sGetExtra.$this->sGet.'='.$this->aPage['first']['number'].'"><<</a> ';
		}
		else{
			
			$sReturn = '<b><<</b> ';
		}
		
		// Link for previous
		if($this->aPage['prev']['link'] === true){
			
			$sReturn .= '<a href="?'.$this->sGetExtra.$this->sGet.'='.$this->aPage['prev'].'"><</a> ';
		}
		else{
			
			$sReturn .= '<b><</b> ';
		}
		
		// Link for page numbers
		$iCount = count($this->aPage['numbers']);
		
		for($iNumb = 0; $iNumb < $iCount; $iNumb++){
			
			if($this->aPage['numbers'][$iNumb]['link'] === true){
				
				$sReturn .= '<a href="?'.$this->sGetExtra.$this->sGet.'='.$this->aPage['numbers'][$iNumb]['number'].'">'.$this->aPage['numbers'][$iNumb]['number'].'</a> ';
			}
			else{
				
				$sReturn .= '<b>'.$this->aPage['numbers'][$iNumb]['number'].'</b> ';
			}
		}
		
		// Link for next
		if($this->aPage['next']['link'] === true){
			
			$sReturn .= '<a href="?'.$this->sGetExtra.$this->sGet.'='.$this->aPage['next']['number'].'">></a> ';
		}
		else{
			
			$sReturn .= '<b>></b> ';
		}
		
		// Link for last
		if($this->aPage['last']['link'] === true){
			
			$sReturn .= '<a href="?'.$this->sGetExtra.$this->sGet.'='.$this->aPage['last']['number'].'">>></a> ';
		}
		else{
			
			$sReturn .= '<b>>></b> ';
		}		
		
		return $sReturn;
	}
	
	function return_min_max(){
		
		$iMin = ($this->iPageNumber-1) * $this->iPerPage;
		$iMax = ($this->iPageNumber) * $this->iPerPage;
		
		return 
			array(
				'min'		=> $iMin,
				'max'		=> $iMax,
				'perpage'	=> $this->iPerPage
			);
	}
}
?>

Zoals je ziet heeft de class 4 functies, de eerste functie navigation  wordt meteen aangeroepen als je $Nav = new navigation() doet. In de volgende code vind je wat uitleg over de functies met een voorbeeld erbij:
<?php
// De test array
$aTest = array('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17',	'18','19','20',	'21','22','23','24','25','26','27','28');

// De class aanroepen
// navigation("aantal gegevens", "aantal gegevens per pagina", "hoe moet de url noemen (standaard page dus ?page= in de url)")
$aNavigation = new navigation(count($aTest), 4);

// Deze functie returned de minimum en de maximum waarde voor bijvoorbeeld een array.
// Ook kan je het aantal gegevens per pagina aanroepen zodat je dit maar op een plaats
// moet weizigen als je dit wenst.
// De functie returned een array zoals hieronder:
// array(
// 'min' => "hier de minimum waarde"
// 'max' => "hier de maximum waarde"
// 'perpage' => "hier het aantal gegevens per pagina"
// Hieronder zie je een voorbeeld: 
$aMinMax = $aNavigation->return_min_max();

for($iNumb = $aMinMax['min']; $iNumb < $aMinMax['max']; $iNumb++){
	
	echo ((isset($aTest[$iNumb])) ? $aTest[$iNumb].'<br />' : '');
}

// Deze functie returned de navigatie zelf in de vorm van:
// << < 1 2 3 4 > >>
echo $aNavigation->show_navigation();

// Als de vorige functie niet de gewenste output geeft heb ik er nog een functie bijgezet dat je
// gewoon met arrays je eigen ding kan maken. Bekijk het maar eens, gebruik var_dump om de uitkomst
// te zien. Het is een fijne functie om wat mee te spelen, je eigen ding te maken.
// 'link' => true wilt zeggen dat het een link moet zijn
// 'link' => false wilt zeggen dat het geen link moet zijn, dus bijvoorbeeld onderlijnd of bold of ...
// Indien er nog vragen zijn zet het maar in de reacties
var_dump($aNavigation->return_navigation());

// De uitkomst van deze functie in dit voorbeeld is:
/*
array(5) {
  ["first"]=>
  array(2) {
    ["link"]=>
    bool(true)
    ["number"]=>
    int(1)
  }
  ["prev"]=>
  array(2) {
    ["link"]=>
    bool(true)
    ["number"]=>
    int(3)
  }
  ["numbers"]=>
  array(8) {
    [0]=>
    array(2) {
      ["link"]=>
      bool(true)
      ["number"]=>
      int(1)
    }
    [1]=>
    array(2) {
      ["link"]=>
      bool(true)
      ["number"]=>
      int(2)
    }
    [2]=>
    array(2) {
      ["link"]=>
      bool(true)
      ["number"]=>
      int(3)
    }
    [3]=>
    array(2) {
      ["link"]=>
      bool(false)
      ["number"]=>
      int(4)
    }
    [4]=>
    array(2) {
      ["link"]=>
      bool(true)
      ["number"]=>
      int(5)
    }
    [5]=>
    array(2) {
      ["link"]=>
      bool(true)
      ["number"]=>
      int(6)
    }
    [6]=>
    array(2) {
      ["link"]=>
      bool(true)
      ["number"]=>
      int(7)
    }
    [7]=>
    array(2) {
      ["link"]=>
      bool(true)
      ["number"]=>
      int(8)
    }
  }
  ["last"]=>
  array(2) {
    ["link"]=>
    bool(true)
    ["number"]=>
    float(8)
  }
  ["next"]=>
  array(2) {
    ["link"]=>
    bool(true)
    ["number"]=>
    int(5)
  }
}
*/
?>