1

単語の配列があり、各単語はその日の午後5時から翌日の午後5時まで有効で、次の単語が有効です。金曜日の単語が月曜日の午後5時まで続く週末を除いて。

今私がやろうとしているのは、ユーザーが入力した単語がその期間有効かどうかを判断することです。私にはうまく機能する実例がありますが、私の問題は週末がすべてを台無しにすることです。そして、私はそれらを機能させる方法を理解できないようです。

2つのタイムスタンプの間に発生する週末の数を把握する関数を取得しました

// Figure out how many weekends occured between two dates
function weekends($date1, $date2) {
    $d1 = new DateTime('@' . $date1);
    $d2 = new DateTime('@' . $date2);

    // Compare the two dates
    $diff = $d1->diff($d2);

    // Get number of days between them
    $days = $diff->format('%a');

    // Find out day of the week we start on
    $start = $d1->format('w');

    // Verify we are not on a weekend
    if($start == 0 || $start == 6)
        return false;

    // Number of days until weekend
    $until_weekend = 7 - $start; // (6 is Saturday but we are counting today)

    // Find out how many days are left between the first weekend and the end
    $left = $days - $until_weekend;

    // How many weekends
    $weekends = floor($left / 7) + 1;

    return $weekends;
}

そして、その単語がその日付範囲で有効かどうかを判断する関数を取得しました

// Keyword Validation
function keyword_validate($keywords = array()) {
    if(empty($keywords)) return false;

    // Break into values
    $keyword = $keywords['keyword'];
    $contest = $keywords['contest'];
    $keywords = $contest['keywords'];

    // Get some dates
    $now = new DateTime('now');
    $start = new DateTime('@' . $contest['start_time']);
    $s1 = new DateTime('@' . $contest['start_time']); // value for timestamps
    $s2 = new DateTime('@' . $contest['end_time']); // value for timestamps
    $end = new DateTime('@' . $contest['end_time']);

    // Verify keyword exists
    if(in_array($keyword, $keywords) === FALSE)
        return false;

    // Get index
    $index = array_search($keyword, $keywords);

    // See if we somehow got more then one keyword
    if(count($index) != 1)
        return false;

    // get number of weekends
    $weekends = weekends($start->getTimestamp(), $end->getTimestamp());

    // Based on index get the two container timestamps
    $s = $s1->add(new DateInterval('P' . $index + $weekends . 'D'));

    // Verify start doesn't equal Friday or a Weekend

    $e = $s2->add(new DateInterval('P' . $index + $weekends + 1 . 'D'));

    if($s === FALSE || $e === FALSE)
        return false; // Something really bad happened

    // Based on dates find out if the keyword works.

    print $s->getTimestamp();
    print $e->getTimestamp();
    // Get the current time

}

お分かりのように、キーワード機能はATMでは機能しません。私がATMで行っているのは、キーワードのインデックスを今日と一致させることですが、火曜日(2週間後)の場合、インデックスを4増やすにはどうすればよいですか?これが意味をなさない場合は、申し訳ありません。少し迷っています。

4

2 に答える 2

0

7つのスペースを含むことができる配列だけではありませんか?「金曜日」のインデックスが変更された場合は、それを反映するように「土曜日」/「日曜日」を設定します。

于 2013-01-17T18:29:17.417 に答える
0

問題を再定義して、問題を単純化してみてください。どのアイテムがどの日に関連付けられているかを把握するために面白い例外を使って数学を行う代わりに、おそらく毎日の単語の値を使用して新しい配列を作成してみてください。次のようになります。

array(
    'cake',
    'pie',
    'pudding',
    'happy', //friday
    'happy', //saturday
    'happy', //sunday
    'nothappy',
    ...
);

この配列の構築は、現在実行しようとしていることよりも簡単なはずです。この配列を取得したら、チェックは簡単です。

于 2013-01-17T18:44:19.173 に答える