#!/usr/bin/perl use strict; use warnings; use Data::Dumper qw(Dumper); sub FormatPagedResults { my( $itemsCount, $itemsPerPage, $actualPageId ) = @_; # wieviel "rand" soll dargestellt werden? sprich: # wie viele Links sollten jeweils neben dem aktuellen angezeigt werden? my $border = 2; # Ausnahmefaelle definieren; evtl. sollten die uebergebenen Werte # auf Gueltigkeit geprueft werden? return [] unless ( $itemsCount > 0 ); return [] unless ( defined $actualPageId ); # ID d. letzten Seite ermitteln; mehr darf nicht sein! my $last = int ( $itemsCount / $itemsPerPage + ( $itemsCount % $itemsPerPage == 0 ? 0 : 1 ) ); # Anfang und Ende vor-befuellen my %pages = ( # PAGE => Set_link (boolean) 1 => 1, $last => 1, ); # den Bereich um die aktuelle Seite eintragen for my $id ( $actualPageId-$border .. $actualPageId+$border ) { # Werte ausserhalb der Gueltigkeit ueberspringen next if ( $id < 1 or $id > $last ); # ansonsten eintragen $pages{$id} = 1; } # akt. Seite eintragen; ueberschreibt evtl. default f. erste/letzte Seite # vorausgesetzt, die Seitenzahl ist im gueltigen Bereich if ( $actualPageId > 0 and $actualPageId < $last ) { $pages{$actualPageId} = 0; } # Hash umwandeln in den benoetigten AoH my @pages = (); my $prev = 0; for my $id ( sort { $a <=> $b } keys %pages ) { # Abstandshalter einfuegen if ( $id - 1 != $prev ) { push( @pages, { 'id' => '...', 'link' => 0 } ); } push ( @pages, { 'id' => $id, 'link' => $pages{$id} } ); $prev = $id; } return \@pages; } # FormatPagedResults ( $itemsCount; $itemsPerPage, $actualPageId ) #$Data::Dumper::Sortkeys = 1; #print Dumper ( FormatPagedResults( 0, 0, 10 ) ); testing(); sub testing { my $itemsPerPage = 10; output( FormatPagedResults( 199, $itemsPerPage, $_)) for 0..20; output( FormatPagedResults( 1 , $itemsPerPage, $_)) for 0..3; output( FormatPagedResults( 211, $itemsPerPage, $_)) for 21..23; output( FormatPagedResults( 218, $itemsPerPage, $_)) for (1,2,4,6,9,14,19,20,22); output( FormatPagedResults( 0 , $itemsPerPage, 0 )); output( FormatPagedResults( 130, $itemsPerPage, $_ )); output( FormatPagedResults( 81, $itemsPerPage, $_ )) for (3..8); } sub output { my $aref = shift; print "Output: ", join( ' ', map { $_->{link} ? "L<$_->{id}>" : "'$_->{id}'" } @$aref ), "\n\n"; }