PHP 簡易ページャーの仕組みがよく分からない・・・


$page = 10;
//===============ファイルの読み込み===================
$lines = file("m_main.log"); // ファイルの内容を配列に格納
$num = count($lines);//m_main.logの合計件数
$p = (isset($_GET['row']) ? min(max(0, $_GET['row'] - 1), floor($num / $page)) : 0);
//===============リンク作成===================
$link = ($p > 0 ? '<a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . $p . '">前ページ</a> ': '') .
($p + 1) .
($num - $page * $p > 1 ? ' <a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . ($p + 2) . '">次ページ</a> ': '');
echo $link;

こちらで質問して、頂いた回答なのですが、いざ設置して、うごいても仕組みがよくわかりません。初心者なので、なんでも
if(○○){△△△}
と、書いてしまうので、文法がちんぷんかんぷんです・・・『?』とか『:』っていったいなんなのでしょう??
ちなみに、このページャーだと、次のページが無くても、
例えば10件~16件目までの中途半端な数になっても、『次ページ』と、リンクが出てしまいます・・。これもどうにか直したいです

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2010/04/21 11:09:01
  • 終了:2010/04/21 14:13:22

ベストアンサー

id:GreenStar No.3

GreenStar回答回数192ベストアンサー獲得回数462010/04/21 14:02:22

ポイント70pt

(1)まずは間違い部分の訂正からさせていただきます。

(質問終了は納得したという意思表示にもなります。納得するまでは締め切りにして新規回答を受け付けないようにして検証し、返答欄に不明点を書き込み、回答者はコメント欄で応答するのが賢いやりかたです。)

$num - $page * $p > 1

$num - $page * $p > $page

残りが$pageより多ければ続きがあるという認識にしなければなりませんでした。検証不足で申し訳ない。


(2)三項演算子をIFに直してみると以下のような具合になります。

三項演算子
$p = (isset($_GET['row']) ? min(max(0, $_GET['row'] - 1), floor($num / $page)) : 0);

IF分岐
if (isset($_GET['row'])) {
    $p = min(max(0, $_GET['row'] - 1), floor($num / $page));
} else {
    $p = 0;
}
三項演算子
$link = ($p > 0 ? '<a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . $p . '">前の' . $page . '件</a>  ': '')  .
    ($p + 1) .
    ($num - $page * $p > $page ? '  <a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . ($p + 2) . '">次の' . $page . '件</a> ': '');

IF分岐
$link = $p + 1;
if ($p > 0) {
    $link = '<a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . $p . '">前の' . $page . '件</a>  ' . $link;
}
if ($num - $page * $p > $page) {
    $link .= '  <a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . ($p + 2) . '">次の' . $page . '件</a> ';
}

(3)代入演算子

上記説明で使ったものです。下記2行は同じ結果になりますが代入演算子のほうが少しですがスッキリします。

$link .= '  <a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . ($p + 2) . '">次の' . $page . '件</a> ';
$link = $link . '  <a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . ($p + 2) . '">次の' . $page . '件</a> ';

http://www.php.net/manual/ja/language.operators.assignment.php

id:goodbabies

前回の質問より、大変お世話になりました。以後質問方法については気をつけたいと思います。

大変勉強になりました!ありがとうございました。

2010/04/21 14:11:54

その他の回答(2件)

id:hatake-kakasi No.1

hatake-kakasi回答回数2ベストアンサー獲得回数02010/04/21 12:10:25

ポイント5pt

それは三項演算子といいます。

id:goodbabies

三項演算子ですね。

これで辞書がひけます。ありがとうございます。

2010/04/21 14:12:25
id:ko8820 No.2

ko8820回答回数1221ベストアンサー獲得回数692010/04/21 13:45:15

ポイント5pt

条件 ? 真の時 : 偽のとき

IF文でかくと

if(条件){ 真の時}else{偽の時}

id:goodbabies

ありがとうございます。

2010/04/21 14:12:35
id:GreenStar No.3

GreenStar回答回数192ベストアンサー獲得回数462010/04/21 14:02:22ここでベストアンサー

ポイント70pt

(1)まずは間違い部分の訂正からさせていただきます。

(質問終了は納得したという意思表示にもなります。納得するまでは締め切りにして新規回答を受け付けないようにして検証し、返答欄に不明点を書き込み、回答者はコメント欄で応答するのが賢いやりかたです。)

$num - $page * $p > 1

$num - $page * $p > $page

残りが$pageより多ければ続きがあるという認識にしなければなりませんでした。検証不足で申し訳ない。


(2)三項演算子をIFに直してみると以下のような具合になります。

三項演算子
$p = (isset($_GET['row']) ? min(max(0, $_GET['row'] - 1), floor($num / $page)) : 0);

IF分岐
if (isset($_GET['row'])) {
    $p = min(max(0, $_GET['row'] - 1), floor($num / $page));
} else {
    $p = 0;
}
三項演算子
$link = ($p > 0 ? '<a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . $p . '">前の' . $page . '件</a>  ': '')  .
    ($p + 1) .
    ($num - $page * $p > $page ? '  <a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . ($p + 2) . '">次の' . $page . '件</a> ': '');

IF分岐
$link = $p + 1;
if ($p > 0) {
    $link = '<a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . $p . '">前の' . $page . '件</a>  ' . $link;
}
if ($num - $page * $p > $page) {
    $link .= '  <a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . ($p + 2) . '">次の' . $page . '件</a> ';
}

(3)代入演算子

上記説明で使ったものです。下記2行は同じ結果になりますが代入演算子のほうが少しですがスッキリします。

$link .= '  <a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . ($p + 2) . '">次の' . $page . '件</a> ';
$link = $link . '  <a href="' . $_SERVER['SCRIPT_NAME'] . '?row=' . ($p + 2) . '">次の' . $page . '件</a> ';

http://www.php.net/manual/ja/language.operators.assignment.php

id:goodbabies

前回の質問より、大変お世話になりました。以後質問方法については気をつけたいと思います。

大変勉強になりました!ありがとうございました。

2010/04/21 14:11:54

コメントはまだありません

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

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

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

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