2015-07-08 3 views
-1

У меня есть массив с датамиPHP - вычислить средний интервал на массиве дат

Array 
(
    [0] => 2014-09-05 
    [1] => 2014-09-09 
    [2] => 2014-09-09 
    [3] => 2014-09-11 
    [4] => 2014-09-16 
    [5] => 2014-09-18 
    [6] => 2014-09-25 
) 

Посмотрите интервал между этими датами составляет примерно 3 дня.

Как я могу вычислить этот интервал автоматически?

+1

Вы пробовали что-нибудь? – Rizier123

+1

не. не знаю, как это сделать – anderlaini

+0

http://php.net/foreach http://php.net/strtotime –

ответ

1

Это должно работать для вас:

Просто цикл через все ваши даты и проверьте, есть ли еще следующая дата. Если да, вычитайте обе временные метки и добавьте их в массив $intervals.

В конце просто возьмите среднее из интервалов, которое находится в секундах, поэтому вы можете разделить его на 3600 * 24, чтобы получить средний дневной интервал.

<?php 

    $dates = [ 
     "2014-09-05", 
     "2014-09-09", 
     "2014-09-09", 
     "2014-09-11", 
     "2014-09-16", 
     "2014-09-18", 
     "2014-09-25", 
     ]; 

    foreach($dates as $key => $date) { 
     if(isset($dates[($key+1)])) 
      $intervals[] = abs(strtotime($date) - strtotime($dates[($key+1)])); 
    } 

    $average = array_sum($intervals)/count($intervals); 
    echo $average/(3600 * 24); 

?> 

выход:

_ 
3.33 //If you want you can round it up 
-1
Array 
(
    [0] => 2014-09-05 
    [1] => 2014-09-09 
    [2] => 2014-09-09 
    [3] => 2014-09-11 
    [4] => 2014-09-16 
    [5] => 2014-09-18 
    [6] => 2014-09-25 
) 



for($i=count(data);i>0;i--){ 
     echo date("d",strtotime($data[i]))-date("d",strtotime($data[i-1]))."<br/>"; 
} 
1

генерировать $difference_map массив, имеющее различие между двумя датами из вашего массива входных $dates,

$difference_map = array_map(function($v, $k) use ($dates){ 
        if($k == array_keys($dates)[0]) return; 
        $start = new DateTime($dates[$k-1]); 
        $end = new DateTime($dates[$k]); 
        $diff = $start->diff($end); 
        return $diff->format('%R').$diff->days; 
       }, $dates, array_keys($dates)); 

Затем посчитайте средний путь,

$average = array_sum($difference_map)/(count($difference_map)-1); 

Если взять массив как показано $dates в этом сценарии, $difference_map будет выглядеть,

array (size=7) 
    0 => null 
    1 => string '+4' (length=2) 
    2 => string '+0' (length=2) 
    3 => string '+2' (length=2) 
    4 => string '+5' (length=2) 
    5 => string '+2' (length=2) 
    6 => string '+7' (length=2) 

Наконец, $average будет,

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