2016-05-05 2 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

Один из способов сделать это с помощью DatePeriods:

$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

@ Dagon я тестировал оба, и он работал, я только что выбрал первый, но теперь у меня проблема с этим, я собираюсь попробовать этот –

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); 

Сплин:

 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 @ вползавший. – Poiz

+0

Добавление дня в секундах - это действительно ** плохая идея **, дни не все четные. есть классы дат, которые вы должны использовать для этого: http://php.net/manual/en/class.datetime.php –

Смежные вопросы