2017-08-03 26 views
1

私はアイテムを含む配列を持っています。各項目にはタイトルと開始日があります。今私は週ごとにこれらの項目をグループ化したい。書類を見ると、フォーマット - >( 'W') 週が月曜日から始まります。これを土曜日に変更する必要があります。日付を含むPHP配列(土曜日まで)土曜日までのフライデー

 $items = [ 
     [ // friday 
      'title'  => 'test', 
      'startdate' => '2016-03-18', // first group 
     ], 
     [ // saturday 
      'title'  => 'test', 
      'startdate' => '2016-03-19', // second group 
     ], 
     [ // sunday 
      'title'  => 'test', 
      'startdate' => '2016-03-20', // second group 
     ], 
     [ // monday 
      'title'  => 'test', 
      'startdate' => '2016-03-21', // second group 
     ], 
     [ // saterday 
      'title'  => 'test', 
      'startdate' => '2016-03-26', // third group 
     ], 
    ]; 

私はこのような何かが、その正常に動作していない

 foreach($items as $item) { 
      // group by week 
      $startDate  = \DateTime::createFromFormat('Y-m-d', $item['startdate']); 
      $currectWeek = $startDate->format('W'); 
      $saturday  = 6; 
      $friday   = 5; 

      $test = clone $startDate; 

      if($currectWeek !== 5){ 
       $test->modify('last friday'); 
      } 

      if($currectWeek !== 6){ 
       $test->modify('next saturday'); 
      } 

      $a = $test->format('W'); 

      if(!isset($items_by_week[$a])){ 
       $items_by_week[$a] = []; 
      } 

      $items_by_week[$a][] = [ 
       'title' => $item['title'], 
       'date'  => $item['startdate'], 
      ]; 
     } 
+0

何が問題なのですか?あなたの$ items_by_week配列が週番号でグループ化されています。 –

+1

以下のanwserで解決したサンプル入力を探しているサンプル出力をお知らせください:https://stackoverflow.com/questions/13128854/php-datetime-class-change-first-day-of-the -week-to-monday#answer-13129157 – Bham

答えて

0

をしましたが一週間もグループ化以下のコード

$startDate = \DateTime::createFromFormat('Y-m-d', $item['startdate']); 
$week = intval($startDate->format('W')); 
$day = intval($startDate->format('N')); 

$a = ($day < 6) ? $week-1 : $week; 
+0

どうすれば別の年でもアカウントを取ることができます – Bham

+0

最初の1週間として数えたいと思う新年の開始からの日数の最小値によって異なります。 min = 4の場合、PHPでDateTimeを実装しているので、私のコードが動作します。 – Denis

0

を試してみてください(週は金曜日に土曜日に始まり、終わるところでありますワーキング)。これは結果で、次のコードからの用途があります。

$byWeek = array(); 
foreach ($items as $item) { 
    $date = DateTime::createFromFormat('Y-m-d', $item['date']); 

    $firstDayOfWeek = 6; // Saturday 

    $difference = ($firstDayOfWeek - $date->format('N')); 
    if ($difference > 0) { $difference -= 7; } 
    $date->modify("$difference days"); 
    $week = $date->format('W'); 

    if(!isset($byWeek[$week])){ 
     $byWeek[$week] = []; 
    } 

    $byWeek[$week][] = $item; 
} 

// result 
     Array 
     (

     [31] => Array 
      (
       [0] => Array 
        (
         [title] => test 11 
         [date] => 2017-08-11 
        ) 

      ) 

     [32] => Array 
      (
       [0] => Array 
        (
         [title] => test 
         [date] => 2017-08-12 
        ) 

       [1] => Array 
        (
         [title] => test 222 
         [date] => 2017-08-12 
        ) 

       [2] => Array 
        (
         [title] => test 1 
         [date] => 2017-08-13 
        ) 

       [3] => Array 
        (
         [title] => test 2 
         [date] => 2017-08-14 
        ) 

      ) 

しかし、今でも週単位でグループ化したいと考えています。次のような出力が必要です

Array 
(
    [32] => Array 
     (
      [0] => Array 
       (
        [0] => Array 
         (
          [title] => test 
          [date] => 2017-08-12 
         ) 

        [1] => Array 
         (
          [title] => test 222 
          [date] => 2017-08-12 
         ) 

       ) 

      [1] => Array 
       (
        [title] => test 1 
        [date] => 2017-08-13 
       ) 

     ) 

) 
関連する問題