0

私は実際に動作するスクリプトを持っています (以下を参照)。私の弁護では、私はこのコードを何ヶ月も前に書きましたが、それは重要ではありません。ループや条件を減らし、コード内のノイズを少なくして、このコードをより効率的に記述する方法について誰かがアイデアを持っているかどうか、私は興味がありました。

問題のコード:

private function pageLinks($num, $page = 1, $search = false, $ne = false) {
    $query = ($search) ? '&query='.$search : null;
    $by = (is_numeric($ne)) ? '&by='.$ne : null;
    $links = 'Page(s):<a href="search.php?page=1' . $query . $by . '" class="tableLink">1</a>';
    $count = 1;
    $npp = $this->numPerPage;
    $buttons = 9;
    $half = 4;
    for($i = 1; $i <= $num; $i++) {
        if(($i%$npp) === 0) {
            $count++;
        }
    }
    if($count < $buttons) {
        for($i = 2; $i <= $count; $i++) {
            $links .= '<a href="search.php?page=' . $i . $query . $by . '" class="tableLink">' . $i . '</a>';
        }
    } elseif($page <= ($half + 2)) {
        for($i = 2; $i <= $buttons; $i++) {
            $links .= '<a href="search.php?page=' . $i . $query . $by . '" class="tableLink">' . $i . '</a>';
        }
        $links .= '...<a href="search.php?page=' . $count . $query . $by . '" class="tableLink">' . $count . '</a>';
    } elseif($page <= ($count - ($half + 2))) {
        $links .= '...';
        for($i = $half; $i > 0; $i--) {
            $links .= '<a href="search.php?page=' . ($page - $i) . $query . $by . '" class="tableLink">' . ($page - $i) . '</a>';
        }
        $links .= '<a href="search.php?page=' . ($page - $i) . $query . $by . '" class="tableLink">' . ($page - $i) . '</a>';
        for($i = 1; $i <= $half; $i++) {
            $links .= '<a href="search.php?page=' . ($page + $i) . $query . $by . '" class="tableLink">' . ($page + $i) . '</a>';
        }
        $links .= '...<a href="search.php?page=' . $count . $query . $by . '" class="tableLink">' . $count . '</a>';
    } else {
        $links .= '...';
        for($i = $buttons - 1; $i >= 0; $i--) {
            $links .= '<a href="search.php?page=' . ($count - $i) . $query . $by . '" class="tableLink">' . ($count - $i) . '</a>';
        }
    }
    return($links);
}

メソッドは次のように呼び出されます。

$links = $this->pageLinks($count, $page, $url, $ne);

そして、変数は次のとおりです。

$count= データベース内のクライアントの総数(int)
$page= 構築元の現在のページ(int)
$url= 検索用の名前または電子メール(String)
$ne= 名前 (1) または電子メール (2) による検索文字列(int)

そして、出力は(リンクとして)のようなものです:

ページ: 1 2 3 4 5 6 7 8 9...33

または、中間の場合 (20 ページ):

ページ: 1... 16 17 18 19 20 21 22 23 24...33

現在、これは常に検索関数を介して呼び出されるとは限らないため、$urlとのデフォルト値です$neが、これはあまり重要ではありません。私の質問は、これらのリンクの構築を処理するよりクリーンな方法はありますか? それとも、このループのクラスターで立ち往生していますか?

4

1 に答える 1

1

codereview.stackexchange.comの人々の助けを借りて、まさに必要なものを見つけました。より詳細なアプローチについては、ここで答えを見つけることができますが、誰かがこれに遭遇して興味がある場合は、更新されたコードを次に示します。

private function pageLinks($num, $page = 1, $search = false, $ne = false) {
    $query = ($search && is_numeric($ne)) ? "&query=" . $search . "&by=" . $ne : null;
    $links = "Page(s):" . $this->page_link(1, $query);
    $npp = $this->numPerPage;
    $half = 4;
    $count = floor($num / $npp) + 1;
    $from = $page - $half;
    if($from <= 2) {
        $from = 2;
    }
    $to = $page + $half;
    if($to >= $count - 1) {
        $to = $count - 1;
    }
    if($from > 2) {
        $links .= "...";
    }
    for($i = $from; $i <= $to; $i++) {
        $links .= $this->page_link($i, $query);
    }
    if($i < $count) {
        $links .= "...";
    }
    $links .= $this->page_link($count, $query);
    return($links);
}
private function page_link($num, $query) {
    return("<a href=\"search.php?page=" . $num . $query . "\" class=\"table_link\">" . $num . "</a>");
}
于 2013-08-17T23:20:32.307 に答える