php - Make 5 minute interval

866

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

Answer

Solution:

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

889

Answer

Solution:

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

People are also looking for solutions to the problem: php - What is the best way of using database host?

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.