1

プログラミングよりも数学に関連しているため、これがこの問題の間違ったサイトである場合は申し訳ありません.Google風の方法で、一連の7ページのリンクを作成しようとしています. 基本的に、それは 7 つの数字になります。ここで、s は私の開始値です。初期値の計算に問題があります。

前もって、一連の最大値は、ユーザーが提供する検索語句に応じて可変であり、7 より小さいか、大きいか、7 に等しい可能性があります。式を書く試みでは、この値を g と呼んでいます。ユーザーが選択したページ番号も知っています。この値を p と呼んでいます。たとえば、g が 21 の場合、これらの一連の数字を生成する必要があります。太字の数字は p に等しくなります。

1 2 3 4 5 6 7

1 2 3 4 5 6 7

1 2 3 4 5 6 7

1 2 3 4 5 6 7

4 5 6 7 8 9 10

5 6 7 8 9 10 11

15 16 17 18 19 20 21

利用可能な情報を使用して開始値を決定できる限り、他のすべてはうまくいきます。入手可能な情報を使用して開始価格を計算する方法について、誰かアドバイスしてもらえますか? 関連する場合は、この式を PHP で記述します。

4

3 に答える 3

2

$nリンクが必要$gで、 がページ数であるとします。この場合$n = 7、開始値は からまで$sの範囲のみです。1$g - ($n - 1)

一般に、これらの制限を超えていない場合、開始値$sは によってページ番号に関連付けられます$s = $p - floor($n / 2)

これらすべてを PHP 関数にまとめると、次のようになります。

// $p -- user's current page
// $g -- total number of pages
// $n -- number of links
function start_link($p, $g, $n)
{
    $s = $p - floor($n / 2);
    if($s < 1)
    {
        return 1;
    }
    $max_s = $g - ($n - 1);
    if($s > $max_s)
    {
        return $max_s;
    }
    return $s;
}

この関数は次のようにテストできます。

print start_link(1,21,7) . "\n";
print start_link(2,21,7) . "\n";
print start_link(3,21,7) . "\n";
print start_link(4,21,7) . "\n";
print start_link(7,21,7) . "\n";
print start_link(8,21,7) . "\n";

これにより、質問で指定したサンプル シーケンスの開始ページが印刷されます。

于 2012-10-03T22:22:29.373 に答える
0

これは式ではなく、アルゴリズムです (Haskell を使用していない限り、一連の反復ステップが含まれるため)。

私が使用するアルゴリズムは次のとおりです。

Int32[] CreateLinks(Int32 currentPageNumber, Int32 totalPages) {
    Int32[] links = new Int32[ Math.Min( totalPages, 10 ) ];
    Int32 start = currentPageNumber < 5 ? 1 : currentPageNumber;
    start = currentPageNumber > totalPages - 5 ? totalPages - 10 : start;
    for(int i=0;i<links.Length;i++) {
        links[i] = start + i;
    }
}

配列Int32[]はページ リンクのセットです。私の実装には隠れたバグがあることに注意してください。わかりますか?

于 2012-10-03T00:28:32.027 に答える
0

これを行うために最終的に書いた(PHP)コードは次のとおりです。しかし、このコードは実際には 9 つの (7 つではなく) 検索ページ リンクの開始ページと終了ページを計算します。

if ($pagecount < 1) $start_page = 0;
else{
    $hyperlink_start_page = $hyperlink_end_page = $current_page;
    $hyperlink_start_page = $hyperlink_start_page - 4;
    $offset = 0;

    if ($hyperlink_start_page < 1 ){
        $offset = 1 - $hyperlink_start_page;
        $hyperlink_start_page = 1;
    }

    $hyperlink_end_page = $hyperlink_end_page + 4 + $offset;
    $offset = 0;

    if ($hyperlink_end_page > $lastpage ){
        $offset = $hyperlink_end_page - $pagecount;
        $hyperlink_end_page = $pagecount;
    }

    $hyperlink_start_page = $hyperlink_start_page - $offset;
    if ($hyperlink_start_page < 1 ) $hyperlink_start_page = 1;
}
于 2012-10-03T21:32:09.103 に答える