Drian Drian
Drian Drian

Reputation: 97

Make 5 minute interval

I'm trying to separate the dates for example:

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

As you can see there are minutes with difference only of 1 minute or even seconds.

What I'm trying to accomplish is to force the dates to be 5 mins interval.

example output

 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

Here's my code

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/>";
}

Upvotes: 0

Views: 1714

Answers (2)

jspit
jspit

Reputation: 7683

Solution with a DateTime extension dt (https://github.com/jspit-de/dt) returns an array with the date as a key. The value supplied is the number of rounded values ​​from the input array. The algorithm can be implemented even without class extension with a few more commands.

$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]++;
} 

The result $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,
)

Upvotes: 0

Nick
Nick

Reputation: 147146

If you want to have an output array with all the 5 minute (or other interval) times between the earliest and latest times in the input array, you can just iterate between them, adding the interval in each loop:

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

Output:

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
)

Demo on 3v4l.org

Upvotes: 1

Related Questions