2017-09-15 23 views
0

ここでは、私の週の配列です。現在の月年は、私がPHP get number of week for monthから、このリンクをコードを持って、コードの下にPHP現在の月の週の数はPHPを使用してのみ取得

function getWeekDates($date, $start_date, $end_date) { 
    $week = date('W', strtotime($date)); 
    $year = date('Y', strtotime($date)); 
    $from = date("Y-m-d", strtotime("{$year}-W{$week}+1")); 

    if ($from < $start_date) 
     $from = $start_date; 

    $to = date("Y-m-d", strtotime("{$year}-W{$week}-7")); 
    if ($to > $end_date) 
     $to = $end_date; 

    $array1 = array(
     "ssdate" => $from, 
     "eedate" => $to, 
    ); 

    return $array1; 
} 

$mm = date('m'); 
$yy = date('y'); 
$startdate = date($yy . "-" . $mm . "-01"); 
$current_date = date('Y-m-t'); 
$ld = cal_days_in_month(CAL_GREGORIAN, $mm, $yy); 
$lastday = $yy . '-' . $mm . '-' . $ld; 
$start_date = date('Y-m-d', strtotime($startdate)); 
$end_date = date('Y-m-d', strtotime($lastday)); 
$end_date1 = date('Y-m-d', strtotime($lastday . " + 7 days")); 
$count_week = 0; 
$week_array = array(); 

for ($date = $start_date; $date < $end_date1; $date = date('Y-m-d', strtotime($date . ' + 7 days'))) { 
    $getarray = getWeekDates($date, $start_date, $end_date); 
    $week_array[] = $getarray; 
    $count_week++; 
} 
echo '<pre>'; 
print_r($week_array); 

を試してみました。しかし、何の意味もありません。ここ

、私の週の配列です:

Array 
(
    [0] => Array 
     (
      [ssdate] => 2017-09-01 
      [eedate] => 2017-09-03 
     ) 

    [1] => Array 
     (
      [ssdate] => 2017-09-04 
      [eedate] => 2017-09-10 
     ) 

    [2] => Array 
     (
      [ssdate] => 2017-09-11 
      [eedate] => 2017-09-17 
     ) 

    [3] => Array 
     (
      [ssdate] => 2017-09-18 
      [eedate] => 2017-09-24 
     ) 

    [4] => Array 
     (
      [ssdate] => 2017-09-25 
      [eedate] => 2017-09-30 
     ) 

    [5] => Array 
     (
      [ssdate] => 2017-10-02 
      [eedate] => 2017-09-30 
     ) 

) 

しかし

Array 
(
    [0] => Array 
     (
      [sdate] => 2017-09-01 
      [sdate] => 2017-09-02 
      [sdate] => 2017-09-03 
     ) 

    [1] => Array 
     (
      [sdate] => 2017-09-04 
      [sdate] => 2017-09-05 
      [sdate] => 2017-09-06 
      [sdate] => 2017-09-07 
      [sdate] => 2017-09-08 
      [sdate] => 2017-09-09 
      [sdate] => 2017-09-10 
     ) 
    [2] => Array 
     (
      [sdate] => 2017-09-11 
      [sdate] => 2017-09-12 
      [sdate] => 2017-09-13 
      [sdate] => 2017-09-14 
      [sdate] => 2017-09-15 
      [sdate] => 2017-09-16 
      [sdate] => 2017-09-17 
      [sdate] => 2017-09-18 
     ) 

    [3] => Array 
     (
      [sdate] => 2017-09-18 
      [sdate] => 2017-09-19 
      [sdate] => 2017-09-20 
      [sdate] => 2017-09-21 
      [sdate] => 2017-09-22 
      [sdate] => 2017-09-23 
      [sdate] => 2017-09-24 
     ) 

    [4] => Array 
     (
      [sdate] => 2017-09-25 
      [sdate] => 2017-09-26 
      [sdate] => 2017-09-27 
      [sdate] => 2017-09-28 
      [sdate] => 2017-09-29 
      [sdate] => 2017-09-30 
     ) 
) 

の下にこの問題

を解決するために私を助けてくださいように私は、唯一の現在の月の配列をしたいです前もって感謝します !!!

+0

例えばその2月には、あなたは4週間たい場合は? –

+0

feb月のためにうまくいきます。もしそれがsep、oct、などであれば、それは次の月の日付も私に与えます。私は現在の月の週の日付だけを欲しい。 – Angel

+0

特定の月の日付または週数が必要ですか? –

答えて

1

今月のデータが必要な場合は、なぜ$end_date1(前日から+7日間)を比較していますか? forループに$end_dateの条件を追加する必要があります。以下のようにループの変更:

for ($date = $start_date; $date < $end_date; $date = date('Y-m-d', strtotime($date . ' + 7 days'))) { 
    $getarray = getWeekDates($date, $start_date, $end_date); 
    $week_array[] = $getarray; 
    $count_week++; 
} 

EDIT時に31日の月の問題があり、あなたのコメントのとおり。だから私はいくつかのコードを変更しました。それを試してみてください。そして、以下のようにループを変更

function getWeekDates($date, $start_date, $end_date) { 
    $week = date('W', strtotime($date)); 
    $year = date('Y', strtotime($date)); 
    $from = date("Y-m-d", strtotime("{$year}-W{$week}+1")); 

    if ($from < $start_date) 
     $from = $start_date; 

    $to = date("Y-m-d", strtotime("{$year}-W{$week}-7")); 
    if ($to > $end_date) 
     $to = $end_date; 
    if($from > $end_date) 
    { 
     $array1 = array(
    ); 
    } 
    else 
    { 
     $array1 = array(
     "ssdate" => $from, 
     "eedate" => $to, 
    ); 
    } 


    return $array1; 
} 

を::次のようにfunction getWeekDatesを変更

for ($date = $start_date; $date <= $end_date1; $date = date('Y-m-d', strtotime($date . ' + 7 days'))) {  
    $getarray = getWeekDates($date, $start_date, $end_date); 
    if(count($getarray)) 
    { 
     $week_array[] = $getarray; 
     $count_week++; 
    } 


} 
+0

あなたの解決策は正しいですか?月は31日、eg.octoberの月は31日、その月の最後の週は29、次に30と31日です配列から取り除く、bt私はそれを望む。 – Angel

+0

私の編集したコード@Angelを試してください –

+1

私の要求に応じて働いていただきありがとうございます。 – Angel

1
<?php 

function getFullWeeksOfMonth($iYear, $iMonth, $sFirstDayOfWeek = 'Sunday', $bExclusive = true) 
{ 
    $iYear   = filter_var($iYear, FILTER_VALIDATE_INT, array(
     'options' => array(
      'default' => (int) date('Y') 
     ) 
    )); 
    $iMonth   = filter_var($iMonth, FILTER_VALIDATE_REGEXP, array(
     'options' => array(
      'default' => (int) date('m'), 
      'regexp' => '/^([1-9]|1[012])$/' 
     ) 
    )); 
    $aDay   = array(
     'monday' => 1, 
     'sunday' => 1 
    ); 
    $sFirstDayOfWeek = filter_var($sFirstDayOfWeek, FILTER_VALIDATE_REGEXP, array(
     'options' => array(
      'default' => 'sunday', //Set default week 
      'regexp' => '/^monday|sunday$/' 
     ) 
    )); 
    $bExclusive  = filter_var($bExclusive, FILTER_VALIDATE_BOOLEAN); 
    $oStart   = new DateTime($iYear . '-' . $iMonth . '-01'); 

    if ($bExclusive === true || ($bExclusive === false && isset($aDay[strtolower($oStart->format('l'))]))) { 
     if ((int) $oStart->format('d') === 1) { 
      $oStart->modify('-1 day'); 
     } 
     $oStart->modify('first ' . $sFirstDayOfWeek . ' ' . $oStart->format('H:i')); 
    } else { 
     $oStart->modify('last ' . $sFirstDayOfWeek . ' ' . $oStart->format('H:i')); 
    } 

    $oEnd = clone ($oStart); 
    if ((int) $oStart->format('m') === $iMonth) { 
     $oEnd->modify('last day of this month'); 
    } else { 
     $oEnd->modify('last day of next month'); 
    } 

    $oInterval = new DateInterval('P1W7D'); 
    $oDaterange = new DatePeriod($oStart, $oInterval, $oEnd); 

    $aDate = array(); 
    $i  = 1; 
    foreach ($oDaterange as $oDate) { 
     $oTestDate = clone $oDate; 
     $oLastWeekDay = $oTestDate->modify('+6 days'); 
     if (((int) $oDate->format('m') === (int) $iMonth || (int) $oLastWeekDay->format('m') === (int) $iMonth) && (($bExclusive === true && (int) $oLastWeekDay->format('m') === (int) $iMonth) || ($bExclusive === false))) { 
      $aDate[$i]['First'] = $oDate->format('Y-m-d'); 
      $aDate[$i]['Last'] = $oLastWeekDay->format('Y-m-d'); 
     } 
     $i++; 
    } 
    return $aDate; 
} 

echo "<pre>"; 

print_r(getFullWeeksOfMonth(2017, 9, 'Sunday')); 

echo "<pre>"; 
?> 

$ iYear年の$ iMonthための変数は、月の数値 表現です(1 - 12)$ sFirstDayOfWeekは、週の最初の曜日として月曜日または日曜日のどちらかを かかります。デフォルトは月曜日です。 $ bExclusiveはブール値で、trueの場合は選択した月の に数週間しかかかりませんが、falseの場合は選択した月に関連するすべての週を アカウントにオーバーラップさせることができます。

結果:

enter image description here

+1

ありがとうございました... – Angel

0
function weeks_in_month($year, $month, $start_day_of_week) 
    { 
    // Total number of days in the given month. 
    $num_of_days = date("t", mktime(0,0,0,$month,1,$year)); 

    // Count the number of times it hits $start_day_of_week. 
    $num_of_weeks = 0; 
    for($i=1; $i<=$num_of_days; $i++) 
    { 
     $day_of_week = date('w', mktime(0,0,0,$month,$i,$year)); 
     if($day_of_week==$start_day_of_week) 
     $num_of_weeks++; 
    } 

    return $num_of_weeks; 
    } 
    $year = 2017; 
    $i=9; 
    echo $year."-".$i."=>&nbsp;".weeks_in_month($year, $i, 1).' weeks<br />'; 
関連する問題