http://q.hatena.ne.jp/1190099081
解答開かれずに終わっちゃったけど、恥ずかしいコードだったので書き直し。

$page   =  7 ; // 表示するページ
$length = 51 ; // 全体のページ数
$range  =  4 ; // 前後の表示範囲

$result = '' ;
if ($length > 0) {
  $page = ($page < 1 ? 1 : ($page > $length ? $length : $page)) ;

  for ($i = 1; $i <= $length; ++$i) {
    $result .= $i ; // リンク文字列等に置き換える

    if ($i == 1 && ($page - $range) > 2 && ($length - 2 * $range > 2)) {
      $i = $page - $range - 1;
      if ($i > $length - 2 * $range-1) $i = $length - 2 * $range - 1 ;
      $result .= (1 < $i ? ' ... ' : '') ;
    }
    elseif (($i < $length - 1) && (($i == $range * 2 + 1 && $i > $page + $range) ||
        ($i == $page + $range && $i > $range * 2 && $i != $length))) {
      $i = $length - 1 ;
      $result .= ($i < $length ? ' ... ' : '') ;
    }
    elseif ($i < $length) $result .= '|' ;
  }
}

echo $result ;