Intanto dipende come vuoi realizzare i gruppi e cosa succede cliccando sui "..."... ti faccio un'ipotesi... supponiamo tu abbia un vettore con l'elenco dei link tipo:

Codice PHP:
$pagine = array(
  
=> '.../.../...',
  
=> '.../.../...',
); 
dove la chiave è il numero di pagina e il valore è il link.
Inoltre sia $pag la pagina attualmente visualizzata.

Potresti avere:
Codice PHP:
$pag_ini 1// prima pagina
$pag_fin sizeof($pagine); // ultima pagina
$pag = ... ; // pagina attuale
$num_pag_da_visualizzare 6;
$pag_sx max(1$pag-($num_pag_da_visualizzare/2));
$pag_dx min($pag_sx+$num_pag_da_visualizzare$pag_fin);
// ... ora mostri solo da $pag_sx a $pag_dx, inolte puoi linkare i "..." a sinistra con max(1, $pag_sx-$num_pag_da_visualizzare) e quelli a destra con min($pag_dx+1, $pag_fin) facendo sempre dei controlli per le "estremità"... 
Naturalmente $pag e $pagine saranno costruiti dinamicamente in qualche modo... inoltre se $num_pag_da_visualizzare è dispari aggiungi un controllo dove si divide per 2. Aggiungi anche dei controlli se ci sono pochi link (sotto il numero minimo non fai alcuna azione).