web-dev-qa-db-fra.com

Elément de calcul compensé pour la pagination

cela semble être un calcul très simple, mais mon cerveau ne peut penser à rien ... 

j'essaie d'implémenter la pagination et devra calculer le décalage d'élément à utiliser pour limiter mes résultats. J'ai des problèmes pour calculer quel index le premier élément de la page devrait avoir. 

par exemple. 

with 1 page having 10 items

page 1 will have items 1 - 10
page 2 ............... 11 - 20
page 3 ............... 21 - 30

j'ai pensé à

offset = page * itemsPerPage + 1

mais ce ne sera pas le cas pour la page 1. il doit y avoir une formule pour cela? J'utilise PHP/Zend_Paginator/Doctrine2 mais cela devrait être indépendant de la langue 

Je me demande si cela devrait être dans le site d'échange de la pile mathématique  

39
Jiew Meng

Utilisez offset = (page - 1) * itemsPerPage + 1.

83
Gumbo

Honnêtement dépend. Je ne suis pas PHP personne, mais je vais mettre les deux là-bas. Si vous extrayez vos enregistrements dans une forme de collection (liste, tableau, etc.), votre formule devrait être:

offset = (page - 1) * itemsPerPage

En effet, la plupart (encore une fois, je ne suis pas une personne PHP) et les listes utilisent 0 pour leur premier élément. S'ils n'utilisent pas 0 pour leur premier élément et/ou si vous extrayez d'une table ou de quelque chose d'autre dont les ID commencent à 1, alors ce devrait être:

offset = (page - 1) * itemsPerPage + 1

J'espère que c'est clair et que ça aide.

30
XstreamINsanity
  start = (page - 1) * itemsPerPage + 1
  end = totalItems

  if (itemsPerPage < totalItems) {
    end = itemsPerPage * page
    if (end > totalItems) {
      end = totalItems;
    }
  }

  // e.g. "21-30 of 193 items"
  start + '-' + end + ' of ' + totalItems + ' items'
9
mynameistechno

En utilisant JS comme exemple, pour les personnes progressistes d'applications web ...

Les tableaux JS ont la méthode prototype .slice(start, end)présentation ici } _ il faut un index de début et un index de fin comme arguments.

J'ai trouvé le moyen le plus simple de calculer les deux indices est le suivant:

Index de début

var start =  parseInt((selectedPage - 1) * resultsPerPage);

Index final

var end = parseInt(selectedPage * resultsPerPage);

Exécution

var myPaginatedArray.slice(start, end);
3

J'ai déjà fait face à cela dans Angular 4, il s'agit d'une édition d'un morceau de modèle avec une liste avec une pagination simplifiée:

<div *ngFor="let item of pagedItems; let i = index">
  <div class="item-caption">
    Item {{(currentPage - 1) * itemsPerPage + (i + 1)}} of {{totalItemsDownloaded}}
  </div>
  <div class="item-name">{{item.name}}</div>
</div>

J'ai toujours eu la possibilité d'utiliser currentPage après avoir cliqué sur les boutons Précédent et Suivant, mais initialisé avec 1, itemsPerPage comme paramètre d'application et totalItemsDownloaded est le nombre total d'éléments signalés par l'appel WebAPI.

J'espère que ça aide

0
Sparker73

utilisez ceci

$row_page = 5; //items per page

if(isset($_GET['p'])){
    $page_num = $_GET['p'];
} else {
    $page_num = 0;
}

$offset = ( $page_num ) * $row_page;

$cn = 31;

$pg = (int)ceil($cn / $row_page);

for ($i = 1; $i <= $pg; $i++){
    echo "<br/><a href='?p=$i'>".$i;
}