Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Comparing multiple different dates and getting the average in PHP

Tags:

arrays

php

I use a function called count_days($date1,$date2) that counts the number of days between two dates. But, my question is: the dates come from the DB, in an array like:

Array (
  [imac] => Array (
    [0] => 2002-10-10
    [1] => 2003-11-22
    [3] => 2004-11-10
  )
  [iphone] => Array (
    [0] => 2007-09-11
    [1] => 2008-05-12
    [2] => 2009-06-14
    [3] => 2010-06-05
  )
)

As you can see the products may have a different number of subarrays.
I want to count the days between the first and the next date (and so on!) and then get the average of days.

like image 252
Francesc Avatar asked Jun 05 '26 18:06

Francesc


1 Answers

The DateInterval class is great for this kind of date arithmetic. You can use DateTime::add, DateTime::subtract and DateTime::diff to work with them.

<?php

$types = array(
    'imac' => array ('2002-10-10', '2003-11-22', '2004-11-10'),
    'iphone' => array ( '2007-09-11', '2008-05-12', '2009-06-14', '2010-06-05'),
);

$typeIntervals = array();
$typeAverage = array();
foreach ($types as $type=>$dates) {
    $last = null;
    $typeIntervals[$type] = array();
    foreach ($dates as $date) {
        $current = new DateTime($date);
        if ($last) {
            $interval = $current->diff($last);
            $typeIntervals[$type][] = $interval->days;
        }
        $last = $current;
    }
    $typeAverage[$type] = array_sum($typeIntervals[$type]) / count($typeIntervals[$type]);
}

print_r(typeIntervals);
print_r($typeAverage);

This will output:

Array (
    [imac] => Array (
            [0] => 408
            [1] => 354
        )
    [iphone] => Array (
            [0] => 244
            [1] => 398
            [2] => 356
        )
)
Array (
    [imac] => 381
    [iphone] => 332.66666666667
)
like image 171
Shabbyrobe Avatar answered Jun 07 '26 09:06

Shabbyrobe



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!