2016-05-05 9 views
0
$a = array('2016-05-06', '2016-05-08', '2016-05-20', '2016-05-23'); 

foreach($a as $key => $value){ 
    $dateFrom = $value //2016-05-06 Then 2016-05-20 
    $dateTo = $value //2016-05-08 Then 2016-05-23 

    function range($dateFrom, $dateTo); 
} //in the second loop get the others 2 like above 

ポイントは、私はこれで最初の配列を得た。このこのような配列を壊すことは可能ですか?

Array 
(
    [0] => 2016-05-06 
    [1] => 2016-05-07 
    [2] => 2016-05-08 
    [3] => 2016-05-20 
    [4] => 2016-05-21 
    [5] => 2016-05-22 
    [6] => 2016-05-23 
) 

などの配列を取得し、最初と最後の日付渡し、範囲の端で

を作ることで、今の問題があることですレンジで4日付

foreach(array_slice($dates, 2) as $key => $value){ 
    $a[] .= $datas[$key]; 

    if($key == 0){ 
     $a[] .= $value; 
    } else { 
     $a[] .= $value; 
    } 
} 
+1

'それが可能ですこのような配列を壊す?確かに –

+0

しかし、どのように? @Lashane –

+0

開始日と終了日を読み取り、すべての中間日を生成するコードを記述する必要があります。開始日を1つ増やし、終了日をコードと比較すると、 –

答えて

2

一つの方法:

$ranges = array_chunk($dates, 2);   // Divide the array into groups of two 

$interval = new DateInterval('P1D');  // Define an interval of one day 

foreach ($ranges as $range) { 
    // Create DateTime objects for the start and end dates 
    $start = new DateTime($range[0]); 
    $end = new DateTime($range[1]); 
    $end->add($interval); 

    // Create a new DatePeriod object using the start and end DateTime objects 
    $period = new DatePeriod($start, $interval, $end); 

    // Iterate over the DatePeriod to fill your result array 
    foreach ($period as $date) { 
     $result[] = $date->format('Y-m-d'); 
    } 
} 
+0

それはうまく動作します –

+0

@EddieD。これはあなたが受け入れたものよりも10倍優れています。 –

+0

@ダゴン私は両方をテストしました。最初のものを選んだだけですが、今は問題があります。これを試してみます。 –

0

を使用すると、はい...それは可能であり、ここで私はあなたが望む想像です:

  <?php 
      $a     = array('2016-05-06', '2016-05-08', '2016-05-20', '2016-05-23'); 
      $arrDuos   = array(); 

      $arrTempRange  = array(); 
      foreach($a as $intKey=>$dateVal){ 
       $arrTempRange[]  = $dateVal; 
       if($intKey != 0 && $intKey%2){ 
        $arrDuos[]  = $arrTempRange; 
        $arrTempRange = array(); 
       } 
      } 

      $arrArrangedDate = array(); 
      foreach($arrDuos as $intKey=>$arrDateRange){ 
       $startDate  = $arrDateRange[0]; 
       $endDate  = $arrDateRange[1]; 
       $dateDiff = date_diff(date_create($endDate), date_create($startDate))->days; 
       for($i = 0; $i<=$dateDiff; $i++){ 
        $incrementedDate = strtotime($startDate) + (60*60*24*$i); 
        $arrArrangedDate[] = date("Y-m-d", $incrementedDate); 
       } 
      } 

      // MANUALLY APPEND THE LAST ELEMENT OF THE ARRAY TO THE 
      // RESULTANT ARRAY IF THE ARRAY LENGTH IS ODD LIKE SO:  
      if(count($a)%2){ 
       $arrArrangedDate[] = end($a); 
      } 

      var_dump($arrArrangedDate); 

ダンプ:DatePeriodsを使用してこれを行うには

 array (size=7) 
      0 => string '2016-05-06' (length=10) 
      1 => string '2016-05-07' (length=10) 
      2 => string '2016-05-08' (length=10) 
      3 => string '2016-05-20' (length=10) 
      4 => string '2016-05-21' (length=10) 
      5 => string '2016-05-22' (length=10) 
      6 => string '2016-05-23' (length=10) 

私はこれがあなたの質問に答える願っています... ;-)

+0

ありがとう..それは正確に私が必要なものです –

+2

しかし、これに注意する価値がある注意点もあります。 ***入力配列の長さが奇数(3,5,7など)の場合、最後の値は切り捨てられます。***しかし、その異常を処理するコードを更新しました。Cheers @ EddieD。 – Poiz

+0

秒を1日追加することは、実際には**悪いアイデアです**、日はすべて均一ではありません。このために使用する日付クラスがあります:http://php.net/manual/en/class.datetime.php –

関連する問題