現在、index.php 1ページに10枚ずつ画像を表示して

「次へ⇒」を押すと「index.php?imageno=10」⇒「index.php?imageno=20」と次のページに行くとという仕様なのですが、

これにさらに
画像の枚数によって以下のように表示されるリンクを考えています。
imagesフォルダに30枚画像があった場合
1|2|3|

数字を押した場合、その数字のリンクだけが無くなり文字だけになります。
ページを移動した場合はその文字はまたリンクに戻ります。

どうか、お助けください。
よろしくお願いいたします。

回答の条件
  • 1人30回まで
  • 13歳以上
  • 登録:2011/09/30 14:47:11
  • 終了:2011/09/30 21:18:36

ベストアンサー

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752011/09/30 15:35:44

$count = count($files);

までは、まぁ、色々ありますが、とりあえずいいです。

もし、すべてのページへのリンクを出すなら、

define('NUM_PER_PAGE', 10);
$numPages = (int)(($count + NUM_PER_PAGE - 1) / NUM_PER_PAGE);
$currentPage = $pageno / NUM_PER_PAGE;

for ($i = 0; $i < $numPages; ++$i) {
    if ($currentPage != $i) {
        echo "<a href=\"./index.php?imageno={$i}\">" . ($i + 1) . "</a>";
    } else {
        echo ($i + 1);
    }
    if ($i != ($numPages - 1)) {
        echo "|";
    }
}

現在のページを含めて5ページ分だけとかなら、

define('NUM_PER_PAGE', 10);
define('NUM_LINKS',    5);
$numPages = (int)(($count + NUM_PER_PAGE - 1) / NUM_PER_PAGE);
$currentPage = $pageno / NUM_PER_PAGE;

$begin = max(array(0, $currentPage - (NUM_LINKS - 1) / 2));
$end   = min(array($numPages - 1, $begin + NUM_LINKS - 1));

for ($i = $begin; $i <= $end; ++$i) {
    if ($currentPage != $i) {
        echo "<a href=\"./index.php?imageno={$i}\">" . ($i + 1) . "</a>";
    } else {
        echo ($i + 1);
    }
    if ($i != ($numPages - 1)) {
        echo "|";
    }
}

みたいな感じでどうでしょ?

動作確認してないので、おかしいところあったらごめんなさいですが、コンセプトは分かってもらえるかと。

何かの参考になれば。

id:prius73

tdoi様

ご回答、誠にありがとうございました。

まさに思い通りの動作で感動いたしました!!

最後にいくつか教えていただきたいのですが、

define('NUM_LINKS', 5);

の“5”の箇所を“10”に変更し、10ずつの表示にしようと思ったんですが、

2.5|3.5|4.5|5.5|6.5|7.5|8.5|

のように表示がおかしくなってしまいます。

何処を修正すればよいでしょうか。

(数値を10以下にすれば、問題ないようです。)


それと、

1|2|3|4|5|6|7|8|9|10|

となっているときに以下のように一番右側に最後のページとなるリンクの表示

1|2|3|4|5|6|7|8|9|10|...27

(27を押した場合は)

18|19|20|21|22|23|24|25|26|27|

最後のページの「...27」のリンクが消えます。

また、

「1」以外にいるときに以下のように左端に「1...」と表示をしたいと考えています。

1...|3|4|5|6|7|8|9|10|11|12|...27


どうかご教授お願いいたします。

よろしく願いいたします。

2011/09/30 17:07:14
  • id:prius73
    試しに作ってみた物が以下ですが、

    画像枚数に寄って情報を追加していく必要があり、
    かなりの労力になってしまします。

    $pageno = isset($_GET['imageno']) ? $_GET['imageno'] : ""; //ページNO

    $files=array();
    $diropen=opendir("images");
    while($file_name=readdir($diropen)) {
    array_push($files,$file_name);
    $count = count($files) -2;

    }

    if( $count > 20 && $count < 30){
    echo '
    <a href="?imageno=0">1</a>|
    <a href="?imageno=10">2</a>|
    <a href="?imageno=20">3</a>';
    }
    else if ( $count == 20 ){
    echo '
    <a href="?imageno=0">1</a>|
    <a href="?imageno=10">2</a>|';
    }

    // ディレクトリを閉じる
    closedir($handle);

  • id:taknt
    色が背景と同じとか じゃないよね?
  • id:tdoi
    あ~。やはり穴がありましたね。
    $beginが最初に表示するページ番号、$endが最後に表示するページ番号になってます。
    $beginの計算がいい加減なので、全部で偶数ページ分だそうとした場合に問題になってます。偶数の場合は、現在から先を多く出すか、それとも、現在より前を多く出すかによって多少変わりますが、$beginのとこをちょっといじってみてください。

    ちなみに書いていて、$begin + NUM_LINKS - 1よりもページ数がない場合の$beginは正しくないことにも気づきました。これもちょっと考えればできるので、いいでしょう。

    画面に表示するページ番号は$beginから$endです。
    ページ数は0から$numPages - 1まであります。
    というのを考えれば、先頭ページへのリンクが必要か、末尾ページへのリンクが必要かは分かりませんか?
  • id:prius73
    tdoi様

    最後までありがとうございました。

    何とか、目的の動作にすることが出来ました。

    本当にありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません