Сделайте 5-минутный интервал - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь разделить даты, например:

$arr=array(
    "2018-06-27 20:30:20",
    "2018-06-27 20:31:20",
    "2018-06-27 20:37:20",
    "2018-06-27 20:45:20",
    "2018-06-27 20:48:20"
);

Как вы можете видеть, есть минуты с разницей всего в 1 минуту или даже секунды.

Что япопытка сделать это заставить интервал дат быть 5 минут.

пример вывода

 2018-06-27 20:30:00
 2018-06-27 20:35:00
 2018-06-27 20:40:00
 2018-06-27 20:45:00
 2018-06-27 20:50:00

Вот мой код

function roundToNearestMinuteInterval($time)
{
   $time = (round(strtotime($time) / 300)) * 300;
   return date('Y-m-d H:i:s', $time);
}

$temp="";
$wave=1;

foreach($arr as $a) {
   if(empty($temp)) {
       $temp= roundToNearestMinuteInterval($a);
   }

   $date= roundToNearestMinuteInterval($a);

   if($temp==$date && $wave!=1){
      $new=date('Y-m-d H:i:s',strtotime('+3 minutes',strtotime($a)));
      $date= roundToNearestMinuteInterval($date);
      $temp= $date;
   }   

   $wave++;
   echo $date."<br/>";
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Решение с расширением DateTime dt (https://github.com/jspit-de/dt) возвращает массив с датой в качестве ключа. Предоставленное значение - это число округленных значений из входного массива. Алгоритм может быть реализован даже без классарасширение с помощью нескольких команд.

$inputArr = array(
  "2018-06-27 20:30:20",
  "2018-06-27 20:31:20", 
  "2018-06-27 20:37:20",
  "2018-06-27 20:45:20",
  "2018-06-27 20:48:20"
);

$interval = "5 Minutes";

//create basis
$resArr = [];
$dt = dt::create(min($inputArr))->round($interval);  //start
$endDate = dt::create(max($inputArr))->round($interval);
for(;$dt <= $endDate; $dt->modify($interval)){
  $key = $dt->format("Y-m-d H:i:s");
  $resArr[$key] = 0;
}

foreach($inputArr as $strDate){
  $key = $dt::create($strDate)
    ->round($interval)
    ->format("Y-m-d H:i:s");
  $resArr[$key]++;
} 

Результат $ resArr

array (
  '2018-06-27 20:30:00' => 2,
  '2018-06-27 20:35:00' => 1,
  '2018-06-27 20:40:00' => 0,
  '2018-06-27 20:45:00' => 1,
  '2018-06-27 20:50:00' => 1,
)
0 голосов
/ 24 сентября 2019

Если вы хотите иметь выходной массив со всеми 5-минутными (или другими интервалами) разами между самым ранним и самым поздним временем во входном массиве, вы можете просто выполнить итерацию между ними, добавив интервал в каждом цикле:

$arr=array("2018-06-27 20:30:20","2018-06-27 20:31:20","2018-06-27 20:37:20","2018-06-27 20:45:20","2018-06-27 20:48:20");

function roundToNearestMinuteInterval($time, $interval) {
    $timestamp = strtotime($time);
    $rounded = round($timestamp / ($interval * 60), 0) * $interval * 60;
    return $rounded;
}

$interval = 5; // minutes
$start = roundToNearestMinuteInterval(min($arr), $interval);
$end = roundToNearestMinuteInterval(max($arr), $interval);
for (; $start <= $end; $start += $interval * 60) {
    $results[] = date('Y-m-d H:i:s', $start);
}
print_r($results);

Вывод:

Array
(
    [0] => 2018-06-27 20:30:00
    [1] => 2018-06-27 20:35:00
    [2] => 2018-06-27 20:40:00
    [3] => 2018-06-27 20:45:00
    [4] => 2018-06-27 20:50:00
)

Демонстрация на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...