0

現在、PHPには「開始」日と「終了」日という2つの日付があります。createDateRangeArray次に、 ( )と呼ばれる関数を使用して、日付の配列を作成しました$date_range。簡単にするために、終了日は常に今日の日付になります。

$valid_datesまた、上記の開始日と終了日の間に常に含まれる一連の日付()を含む別の配列もあります。それらの日に、「何か」が起こりました-この場合、トレーニングセッション。

私は次のことを頭に入れようとしています:

  • 配列に類似した日付の範囲$date_range。トレーニングセッションがその日に行われたかどうかに基づいて、TRUEまたはFALSEが入力されます。dateこれが、session_found(bool)という名前のキーを持つ連想配列になったことを嬉しく思います。
  • 最長の「ストリーク」、つまりトレーニングセッションが発生した最長の連続日数。
  • 最長の「スランプ」、つまりトレーニングセッションが発生しなかった最長の連続日数。

誰かが、配列foreachの内容にを使用せずに上記の情報を取得し、配列の各項目の配列に別の情報を使用する必要があるという正しい方向に私を向けることができますか?それはひどく非効率的です...$date_rangeforeach$valid_dates$date_range

私がそのすべての情報で物事を過度に複雑にしている場合は申し訳ありませんが、どんな助けでも大歓迎です。

私は現在、DebianWheezyでPHP5.4を使用しています(通常のLAMPスタック)。

ありがとう

4

1 に答える 1

3

これは完全にテストされていませんが、次のようなものはどうですか?

最長のストリークとスランプの終了日と、それにかかった日数を取得する必要があります。$ sessionsには、日付をキーとする配列が含まれ、セッションがある日はtrue、セッションがない日はfalseになります。

まだforeachですが、使用を避けることはできないと思います。それが機能するかどうか教えてください、私は本当にこのコードがどれほどうまく動作するかわかりませんが、うまくいけばあなたに出発点を与えるでしょう?

$streak = 0;
$slump = 0;
$longeststreak = 0;
$longestslump = 0;
$longeststreakend = 0;
$longestslumpend = 0;

foreach ($date_range as $date) {
    if (in_array($date, $valid_date)) {
        $sessions[$date] = true;
        $streak++;

        // Slump broken, record the length if it beat the previous record
        if ($longestslump < $slump) {
            $longestslump =  $slump;
            $longestslumpend = $date;
        }

        $slump=0;
    }
    else {
        $sessions[$date] = false;
        $slump++;

        // Streak broken, record the length if it beat the previous record
        if ($longeststreak < $streak) {
            $longeststreak =  $streak;
            $longeststreakend = $date;
        }

        $streak=0;
    }
}
于 2012-10-10T05:06:05.813 に答える