2

特定のルールに基づいて有効な日付の配列を生成する再帰関数を作成しようとしています。

これまでのところ、私はこの機能を持っています

function progDateRange($date, $end_date, $wkDays, $excluded, $dates = array())
{
    $valid_date = false;
    $max_date = new DateTime(date('Y-m-d'));
    $max_date->add(new DateInterval('P2Y'));
    $max_date = $max_date->format('Y-m-d');

    // is this date before the end date or the max date
    if(strtotime($date) <= strtotime($end_date) && strtotime($date) <= strtotime($max_date))
    {
        if(!in_array($date, $excluded))
        {
            foreach($wkDays as $day => $val)
            {
                // is this date a valid weekday start
                if(date("l", strtotime($date)) == $day) {
                    // successful date
                    $valid_date = true;
                }
            }
            if($valid_date) {
                array_push($dates, $date);
            }
        }
        $next_day = new DateTime($date);
        $next_day->add(new DateInterval('P1D'));
        progDateRange($next_day->format('Y-m-d'), $end_date, $wkDays, $excluded, $dates);
    } else {
        return $dates;
    }
}

別のページでそのように使用しています

$datesArray = progDateRange($date_start, $date_end, $wkDays, $excluded);

開始日、終了日、有効な日付が発生する曜日の配列、除外する日付の配列を渡します。

print_r()がこのような関数内にいる場合

$next_day = new DateTime($date);
$next_day->add(new DateInterval('P1D'));
print_r($dates);
progDateRange($next_day->format('Y-m-d'), $end_date, $wkDays, $excluded, $dates);

print_r($datesArray)各ループは配列を出力し、それに正常に追加し続けますが、何らかの理由で別のページで試してみると、空の配列でさえ何も出力されず、理由がわかりません。

関数はほとんどの部分で機能しているように見えるので、何かばかげたことになると確信しています。データを返す時点でつまずいているだけです。

私は何が欠けていますか?

また、 return ステートメントの直前に試してみましたがprint_r()、これは、私が手に入れようとしている正確な配列を返します。関数を呼び出しているページのデータの戻り/取得に間違いなく問題があります...

編集

前に触れていなかったので、ここに$wkDaysとの var ダンプの例を示します。$excluded

$wkDays生産する

array(6) {
  [0]=>
  string(6) "Monday"
  [1]=>
  string(7) "Tuesday"
  [2]=>
  string(9) "Wednesday"
  [3]=>
  string(8) "Thursday"
  [4]=>
  string(6) "Friday"
  [5]=>
  string(6) "Sunday"
}

そして、$excludesこのようなものかもしれません

array(23) {
  [0]=>
  string(10) "2013-04-22"
  [1]=>
  string(10) "2013-04-29"
  [2]=>
  string(10) "2013-05-13"
  [3]=>
  string(10) "2013-05-27"
  [4]=>
  string(10) "2013-06-03"
  //...
}

呼び出しの例は次のようになります。

progDateRange("2013-05-01", "2017-05-01", array("Monday", "Wednesday"), array("2013-06-12", "2013-06-19"));

解決

ジャックスの例を取り上げた後、いくつかの微調整を行う必要があり、最終的にこれになりました。

function progDateRange($date, $end_date, $wkDays, $excluded)
{
    $dates = array();
    $todays_date = strtotime(date("Y-m-d"));
    $current_date = strtotime($date);
    $max_date = min(strtotime('+2 years'), strtotime($end_date));

    while ($current_date < $max_date)
    {
        if (!in_array($date, $excluded) && in_array(date('l', $current_date), $wkDays) && $current_date > $todays_date) {
            array_push($dates, $date);
        }
        $current_date = strtotime('+1 day', $current_date);
        $date = date('Y-m-d', $current_date);
    }
    return $dates;
}
4

2 に答える 2

1

再帰呼び出しの結果を保存する必要があります。このような:

$dates = array_merge(
    $dates,
    progDateRange($next_day->format('Y-m-d'), $end_date, $wkDays, $excluded, $dates)
);

または、すでに試みたように (そのように見えます)、$dates を参照パラメーターによる呼び出しとして使用します。&パラメータ名の前に注意してください。

function progDateRange($date, $end_date, $wkDays, $excluded, &$dates = array())

しかし、私は最初のアプローチを好むでしょう

于 2013-05-22T15:38:18.050 に答える