[PHP/テクニック] 総アイテム数から総ページ数を求める式

ひさしぶりに、PHPネタを書いてみます。

さて、今回のネタ、本当はUtility.phpに書こうと思って書き始めたのですが、よくよく考えてみると、たった1行で終るもののためにfunction()化する必要があるのかないのか?と思ってみたり。。。
で、現在、この記事に該当するカテゴリもないし、どうしようかと思ってとりあえず【テクニック】ってカテゴリを新設してみました。

○○一覧ページ。
って書くと、イメージ沸きますか?

商品一覧ページ。記事一覧ページ。検索結果一覧ページ。などなど。
ここでは、説明の都合で、商品一覧ページとして考えてみます。

1ページに、数件分の情報が表示され、1ページに入りきらない情報は、次のページへ。。ってやつです。
ページの一番下には、 1 2 3 4 5 ... って、それぞれのページへのリンクを設置したくなります。

でも、ちょっと待ってください。【最後のページの番号】って分かりますか?
10ページまであるのか、15ページまであるのか、これが分からないと、作れないですよね。

ということで、

総アイテム数から総ページ数を求める式

※amazonなどwebサービスを利用している場合、もともと結果XMLに【総ページ数】が入っていることがありますが入っていないwebサービスもあります。だけど、【商品数】はどのwebサービスでも大抵の場合、結果XMLに含まれています。ここでは【総ページ数】を自力で計算しなければいけないケースを考えます。

  • 1ページには20件表示したい。
  • 該当する商品の数は、1000アイテムある。

現在、分かっているのはこれだけです。
20件表示したいってのは、あなたや依頼者が決めた仕様上の数字ですし、商品の数はデータベースやWebサービスから取得してきているとします。

この場合は、 1000 ÷ 20 で、全50ページということは暗算でできると思います。
プログラム的にも、 $ret = 1000 / 20; って簡単ですよね。

じゃぁ 商品数が 1010アイテムの時は?
1010 ÷ 20 は、50.5 です。四捨五入して、51ページ必要です。

じゃぁ商品数が 1001アイテムの時は?
1001 ÷ 20 は、50.05 です。四捨五入して、50ページ・・・じゃなくて、50ページ と 1アイテムだから、51ページ。
つまり、少数以下は、繰上げですね。
もっと言うと、(商品数 ÷ 1ページ辺りの件数) の答え"以上"の整数。です。

  • 1000 ÷ 20 = 50 ... 50以上の整数 = 50
  • 1001 ÷ 20 = 50.05 ... 50.05以上の整数 = 51
  • 1019 ÷ 20 = 50.95 ... 50.95以上の整数 = 51
  • 1020 ÷ 20 = 51 ... 51以上の整数 = 51

こうなれば良いんですよね。

ということで、PHPでコードを書くと次のようになります。

define('C_PAGE_IN_COUNT', 20); // 1ページ辺りの表示件数
$TotalItemCount = 1000;  // 全商品数

$TotalPageCount = (int)ceil($TotalItemCount / C_PAGE_IN_COUNT); // 全ページ数

ceil($value); は、【$value以上の整数を返す】関数です。
まさに、こういった目的のためにあるような関数です。
ちなみに、 ceil() は、float型を返します。別にそのままfloat型で返しても構わないのだけど、なんか気持ち悪いので、(int)で整数型にキャストしています。
※目的が「全ページ数を取得する」なので、結果は整数値であるべきですし。

さて、問題は、これをfunction()にするかどうかです。
なんせ、たった1行しかないですから。。。

まぁ試しにfunction()にしてみます。

function getHoge($TotalItemCount, $PageInCount)
{
  return (int)ceil($TotalItemCount / $PageInCount);
}

こうなります。関数名が、getHoge()って適当なのは、"推奨しない"からです。
だって、getHoge() の引数と、実際の計算式比べてみてくださいよ。
【 getHoge 】 が 【 ceil 】に変わるのと、【 , 】 が 【 / 】 に変わる、たったそれだけの違いしかないですし。
しかも、 ceil って文字数自体が少なくて書きやすいですし。
あと、functionにすると、わずかですが処理速度が遅くなりますし。

とりあえず、変な関数名使ってオリジナルなの作るよりは、ceil()を覚えておいたほうが良いってことですね。