Gå til innhold

Anbefalte innlegg

Jeg jobber med et prosjekt der jeg trenger å dele opp data over mange sider, dette skal blant annet inneholde et forum. For en tid tilbake prøvde jeg å finne en god løsning på å dele opp informasjonen og den løsningen jeg likte best av de jeg fant var såkalt "Logarithmic Pagination". Jeg har tittet på blant annet denne:



http://stackoverflow.com/questions/7835752/how-to-do-page-navigation-for-many-many-pages-logarithmic-page-navigation



Jeg har prøvd flere ganger med flere forskjellige løsninger å bygge mitt eget system fra scratch men samme hva jeg prøver får jeg enten parse errors eller feil resultat. Jeg har også prøvd å sette meg inn i og forstå hvordan koden i svaret i linken over fungerer, men grunnet dårlige forklaringer og ekstremt dårlige variabelnavn i utregningen klarer jeg ikke å skjønne det. Håper noen her kan hjelpe meg med å forstå hvordan utregningen fungerer med kodeeksempel, kommentarer og gode variabelnavn.



Det jeg trenger er altså en funksjon som tar antall elementer og gjeldende side som argumenter, funksjonen må ha en variabel som definerer hvor mange tall som skal genereres per step, altså hvis denne variabelen er 5 så skal det bli sånn 1 2 3 4 5 10 20 30 40 50, hvis den er 3 så skal det bli 1 2 3 10 20 30, denne variabelen kaller jeg for "linksPerStep". Trenger også en variabel for hvor mange elementer som skal vises per side da denne avgjør hvor mange sider som skal skrives ut. Antall sider totalt, altså det tallet som funksjonen skal telle opp til = antall elementer totalt / antall elementer per side. Alle talla som genereres må legges inn i en array og returneres av funksjonen.


Her er et eksempel på hvordan resultatet kan se ut:


Si det er 23251 elementer totalt og vi vil ha 20 elementer per side, da skal vi ha 23251 / 20 = 1163 og vi har linksPerStep = 5, og den siden vi er på i øyeblikket er nr 361, da skal det se slik ut:


1 2 3 4 5 10 20 30 40 50 100 200 300 310 320 330 340 350 356 357 358 359 360 361 362 363 364 365 366 370 380 390 400 410 500 600 700 800 900 1000 1100 1110 1120 1130 1140 1150 1158 1159 1160 1161 1162 1163


Håper jeg forklarte problemet mitt greit, hvis ikke er det bare å spørre hvis dere trenger klarhet i noe, på forhånd takk for all hjelp =)


Lenke til kommentar
Videoannonse
Annonse

Ikke direkte det du spør om, men kan dele metoden jeg brukte for å dele opp side-tall på en side jeg lagde for en stund tilbake. Den funker ikke helt på samme måte - men ideen var noe av det samme. Ha små intervaller nært der den siden du er på og større intervaller lengre unna.

<?php
function get_page_links_for_interval($first, $last, $num) {
	$links = array();
	if($first > $last)
		return $links;

	if($last-$first+1 <= $num) {
		return range($first, $last);
	}

	$interval_size = $last - $first;
	for($x=0; $x<$num; $x++) {
		$step = (cos(M_PI/$num*$x)+1)/2;
		$links[] = (int)($first + $interval_size*$step);
	}
	return $links;
}

function get_pages($current_page, $number_of_pages, $max_links, $nearby_pages) {
	$links = array();
	// if the number of pages is less than maximum, just return them
	if($number_of_pages <= $max_links)
		return range(1, $number_of_pages);

	// Add nearby pages
	for($x=0; $x<$nearby_pages; $x++) {
		if($x+1<$current_page)
			$links[] = $x+1;
		if($number_of_pages-$x > $current_page)
			$links[] = $number_of_pages-$x;		
		$nearby_page = $x+$current_page-(int)($nearby_pages/2);
		if($nearby_page > 0 && $nearby_page < $number_of_pages)
			$links[] = $nearby_page;
	}

	// Add pages with some bigger interval between them
	$start = $nearby_pages+1;
	$stop  = $current_page-($nearby_pages/2);
	$num_links = ($max_links-count($links))/2;
	$links = array_unique(array_merge($links, get_page_links_for_interval($start, $stop, $num_links)));

	$start = (int)($current_page+($nearby_pages/2)+1);
	$stop  = $number_of_pages-$nearby_pages-1;
	$num_links = ($max_links-count($links));	
	$links = array_unique(array_merge($links, get_page_links_for_interval($start, $stop, $num_links)));

	sort($links);
	return $links;
}
?>
}
Test input1:

print_r(get_pages(3, 20, 30, 3));
Output

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
    [10] => 11
    [11] => 12
    [12] => 13
    [13] => 14
    [14] => 15
    [15] => 16
    [16] => 17
    [17] => 18
    [18] => 19
    [19] => 20
)
Test input2:

print_r(get_pages(3, 30, 20, 3));
Output:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 9
    [8] => 11
    [9] => 14
    [10] => 16
    [11] => 19
    [12] => 21
    [13] => 23
    [14] => 24
    [15] => 25
    [16] => 26
    [17] => 28
    [18] => 29
    [19] => 30
)
Test input3:

print_r(get_pages(50, 200, 30, 5));
Output:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 9
    [7] => 16
    [8] => 24
    [9] => 33
    [10] => 40
    [11] => 45
    [12] => 47
    [13] => 48
    [14] => 49
    [15] => 50
    [16] => 51
    [17] => 52
    [18] => 59
    [19] => 79
    [20] => 107
    [21] => 139
    [22] => 167
    [23] => 187
    [24] => 194
    [25] => 196
    [26] => 197
    [27] => 198
    [28] => 199
    [29] => 200
)
Lenke til kommentar
  • 2 uker senere...

Det må ryddes en del i koden under, men det fungerer.

$iTotalHits = 23251;
$iHitsPerPage = 20;
$iSteps = 5;
$iBase = 10;
$iCurrentPage = 361;

// Finn antall sider
$iTotalPages = ceil($iTotalHits / $iHitsPerPage);

// Finn log verdi av antall sider
$iLogTotalPages = floor(log($iTotalPages, $iBase));

$aPages[] = $iCurrentPage;

// Produser sidenummer
for($x=0;$x<=$iLogTotalPages;$x++) {
    $iMultiplier = pow($iBase, $x);
    for($i=0;$i<$iSteps;$i++) {
        // Legg til sidenummer fra start
        $iPage = $iMultiplier + ($i * $iMultiplier);
        if($iCurrentPage > $iPage) {
            $aPages[] = $iPage;
        }
        $iPage = null; 

        // Legg til sidenummer ved slutt
        $iPage = $iTotalPages - ($iMultiplier + ($i * $iMultiplier)) + 1;
        if($x > 0) {
            $iPage = round($iPage/$iMultiplier) * $iMultiplier;
        }
        if($iCurrentPage < $iPage) {
            $aPages[] = $iPage;
        }
        $iPage = null; 

        // Legg til sidenummer under valgt side
        $iPage = $iMultiplier + ($i * $iMultiplier);

        if(($iPage = $iCurrentPage - $iPage) > 0) {
            if($x > 0) {
                $iPage = round($iPage/$iMultiplier) * $iMultiplier;
            }
            $aPages[] = $iPage;
        }
        $iPage = null;        

        // Legg til sidenummer over valgt side
        $iPage = $iMultiplier + ($i * $iMultiplier);
        $iPage = $iCurrentPage + $iPage;
        if($iPage < $iTotalPages) {
            if($x > 0) {
                $iPage = round($iPage/$iMultiplier) * $iMultiplier;
            }
            $aPages[] = $iPage;
        }
        $iPage = null;
    }
}

$aPages = array_unique($aPages);
sort($aPages);

print_r($aPages); 
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 10
    [6] => 20
    [7] => 30
    [8] => 40
    [9] => 50
    [10] => 100
    [11] => 200
    [12] => 300
    [13] => 310
    [14] => 320
    [15] => 330
    [16] => 340
    [17] => 350
    [18] => 356
    [19] => 357
    [20] => 358
    [21] => 359
    [22] => 360
    [23] => 361
    [24] => 362
    [25] => 363
    [26] => 364
    [27] => 365
    [28] => 366
    [29] => 370
    [30] => 380
    [31] => 390
    [32] => 400
    [33] => 410
    [34] => 500
    [35] => 600
    [36] => 700
    [37] => 800
    [38] => 900
    [39] => 1000
    [40] => 1100
    [41] => 1110
    [42] => 1120
    [43] => 1130
    [44] => 1140
    [45] => 1150
    [46] => 1159
    [47] => 1160
    [48] => 1161
    [49] => 1162
    [50] => 1163
)
Lenke til kommentar
  • 1 måned senere...

 

Det må ryddes en del i koden under, men det fungerer.

$iTotalHits = 23251;
$iHitsPerPage = 20;
$iSteps = 5;
$iBase = 10;
$iCurrentPage = 361;

// Finn antall sider
$iTotalPages = ceil($iTotalHits / $iHitsPerPage);

// Finn log verdi av antall sider
$iLogTotalPages = floor(log($iTotalPages, $iBase));

$aPages[] = $iCurrentPage;

// Produser sidenummer
for($x=0;$x<=$iLogTotalPages;$x++) {
    $iMultiplier = pow($iBase, $x);
    for($i=0;$i<$iSteps;$i++) {
        // Legg til sidenummer fra start
        $iPage = $iMultiplier + ($i * $iMultiplier);
        if($iCurrentPage > $iPage) {
            $aPages[] = $iPage;
        }
        $iPage = null; 

        // Legg til sidenummer ved slutt
        $iPage = $iTotalPages - ($iMultiplier + ($i * $iMultiplier)) + 1;
        if($x > 0) {
            $iPage = round($iPage/$iMultiplier) * $iMultiplier;
        }
        if($iCurrentPage < $iPage) {
            $aPages[] = $iPage;
        }
        $iPage = null; 

        // Legg til sidenummer under valgt side
        $iPage = $iMultiplier + ($i * $iMultiplier);

        if(($iPage = $iCurrentPage - $iPage) > 0) {
            if($x > 0) {
                $iPage = round($iPage/$iMultiplier) * $iMultiplier;
            }
            $aPages[] = $iPage;
        }
        $iPage = null;        

        // Legg til sidenummer over valgt side
        $iPage = $iMultiplier + ($i * $iMultiplier);
        $iPage = $iCurrentPage + $iPage;
        if($iPage < $iTotalPages) {
            if($x > 0) {
                $iPage = round($iPage/$iMultiplier) * $iMultiplier;
            }
            $aPages[] = $iPage;
        }
        $iPage = null;
    }
}

$aPages = array_unique($aPages);
sort($aPages);

print_r($aPages); 
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 10
    [6] => 20
    [7] => 30
    [8] => 40
    [9] => 50
    [10] => 100
    [11] => 200
    [12] => 300
    [13] => 310
    [14] => 320
    [15] => 330
    [16] => 340
    [17] => 350
    [18] => 356
    [19] => 357
    [20] => 358
    [21] => 359
    [22] => 360
    [23] => 361
    [24] => 362
    [25] => 363
    [26] => 364
    [27] => 365
    [28] => 366
    [29] => 370
    [30] => 380
    [31] => 390
    [32] => 400
    [33] => 410
    [34] => 500
    [35] => 600
    [36] => 700
    [37] => 800
    [38] => 900
    [39] => 1000
    [40] => 1100
    [41] => 1110
    [42] => 1120
    [43] => 1130
    [44] => 1140
    [45] => 1150
    [46] => 1159
    [47] => 1160
    [48] => 1161
    [49] => 1162
    [50] => 1163
)

 

Beklager sent svar, har vært veldig mye opptatt for tiden og lite tid til å titte på dette men det så hvertfall mye bedre ut enn det eksemplet på stackoverflow!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...