web-dev-qa-db-ja.com

ページネーションのアイテムオフセットを計算する

これは非常に単純な数学のように思えますが、どういうわけか、私の脳は考えることができません...

ページネーションを実装しようとしていますが、結果セットの制限に使用するアイテムのオフセットを計算する必要があります。ページの最初のアイテムが持つべきインデックスの計算に問題があります。

例えば。

with 1 page having 10 items

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

と思った

offset = page * itemsPerPage + 1

しかし、これはページ1には当てはまりません。これには式が必要ですか? PHP/Zend_Paginator/Doctrine2を使用していますが、これは言語に依存しないはずです

これが数学スタック交換サイトにあるべきかどうか疑問に思う

45
Jiew Meng

offset = (page - 1) * itemsPerPage + 1を使用します。

93
Gumbo

正直に依存しています。私はPHP personですが、両方ともそこに置きます。レコードを何らかの形式のコレクション(リスト、配列など)に引き込む場合、式は:

offset = (page - 1) * itemsPerPage

これは、ほとんどの(ここでも、私はPHP person)ではない)配列とリストが最初の要素に0を使用しているためです。 IDが1で始まるテーブルまたは他の何かからプルすると、次のようになります。

offset = (page - 1) * itemsPerPage + 1

それが明確で助けになることを願っています。

34
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'
10
mynameistechno

プログレッシブWebアプリのユーザー向けに、JSを例として使用しています...

JS配列には、プロトタイプメソッド.slice(start, end)ここで概要 があり、引数として開始インデックスと終了インデックスを取ります。

両方のインデックスを計算する最も簡単な方法は次のとおりです。

開始インデックス

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

終了インデックス

var end = parseInt(selectedPage * resultsPerPage);

実行

var myPaginatedArray.slice(start, end);
4

Angular 4でこれに直面したことがあります。これは、ページ分割がより簡単になったリストを持つテンプレートの一部の編集です。

<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>

Prev&Nextボタンをクリックした結果、常に便利ですcurrentPageは1で初期化され、itemsPerPageはApp設定として、totalItemsDownloadedはWebAPIの合計アイテム数ですコールが報告されました。

私はそれが役立つことを願っています

0
Sparker73

これを使って

$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;
}

これは完璧で、すべてのシナリオをカバーすると思います。

$offset = ($pageLimit * $page) - $pageLimit;
0
ManojP