CafSneak Skrevet 21. juli 2014 Del Skrevet 21. juli 2014 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
etse Skrevet 21. juli 2014 Del Skrevet 21. juli 2014 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
CafSneak Skrevet 24. juli 2014 Forfatter Del Skrevet 24. juli 2014 Takker for svar, dette er absolutt noe som kan vurderes dersom jeg ikke finner ut av det jeg var ute etter, gir det litt mer tid for å se om noen kommer frem til en god løsning på det jeg i utgangspunktet var ute etter, men dette er nok en god plan B Lenke til kommentar
Lanes Skrevet 1. august 2014 Del Skrevet 1. august 2014 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
CafSneak Skrevet 26. september 2014 Forfatter Del Skrevet 26. september 2014 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå