从Array计算总小时数 - php

时间:2016-04-06 10:05:56

标签: php arrays time sum

我的数组看起来像这样

Array
(
    [0] => Array
        (
            [ltime] => 00:02:55
        )

    [1] => Array
        (
            [ltime] => 00:07:56
        )

    [2] => Array
        (
            [ltime] => 01:03:32
        )   

    [3] => Array
        (
            [ltime] => 01:13:34
        )

    [4] => Array
        (
            [ltime] => 02:13:44
        ) 

    [5] => Array
        (
            [ltime] => 03:08:53
        )

    [6] => Array
        (
            [ltime] => 03:13:54
        )      
)

如何计算此数组的总小时数[ltime]。 这就是我试过的

$sum = 0;
foreach($arr as $shift) {
    $start = explode(':', $shift[0]);
    $end = explode(':', $shift[1]);
    $sum += ($end[0] - $start[0]) + ($end[1] - $start[1]) / 100 / 0.6;
}

哪个不起作用。如何实现这一点。

修改

这正是我想要的。

ltime1 is    00:02 
                    [5 min]   
ltime2 is    00:07 
                    [56 min]
ltime3 is    01:03
                    [10 min]    
ltime4 is    01:13
                    [1 hour]
ltime5 is    02:13
                    [55 min]
ltime6 is    03:08
                    [5 min]
ltime7 is    03:13
---------------------------------------
Total time          3 hours 11 minutes

这实际上是找出所有值之和的时差。

5 个答案:

答案 0 :(得分:3)

您的数据的给定顺序为low -> high。为了计算增加的​​时间,我已将其设为reverse,或者您也可以尝试其他方式。

但关键是让时间采用通用格式 - unix timestamp。我们正在使用strtotime()。剩下的就是遍历计算。

以下代码给出了您期望的结果。

$data = array(
    array('ltime' => "00:02:55"),
    array('ltime' => "00:07:56"),
    array('ltime' => "01:03:32"),
    array('ltime' => "01:13:34"),
    array('ltime' => "02:13:44"),
    array('ltime' => "03:08:53"),
    array('ltime' => "03:13:54")
);

$data = array_reverse($data);

$prev = 0;
$diff = strtotime("00:00:00");

array_walk($data, function($item, $key) use (&$diff, &$prev){
    if ($prev == 0) {
        $prev = strtotime($item['ltime']);
    } else {
        $diff += ($prev - strtotime($item['ltime']));
        $prev = strtotime($item['ltime']);
    }

});

var_dump(date("H:i:s",$diff));

答案 1 :(得分:1)

尝试此功能:

if(typeof Obj.property == "undefined"){
    // Assign value to the property here
    Obj.property = someValue;
}

答案 2 :(得分:1)

看看下面的解决方案:

$total = [
    '00:02:55',
    '00:07:56',
    '01:03:32',
    '01:13:34',
    '02:13:44',
    '03:08:53',
    '03:13:54'
];

$sum = strtotime('00:00:00');
$sum2=0;
foreach ($total as $v){

    $sum1=strtotime($v)-$sum;

    $sum2 = $sum2+$sum1;
}

$sum3=$sum+$sum2;

echo date("H:i:s",$sum3);

输出:

11:04:28

以上解决方案是时间的总和。

<强>更新

请参阅以下解决方案以获得所需结果:

$x = null;
$sum = strtotime('00:00:00');
foreach($total as $t){
    $date = new DateTime($t);
    if($x){
        $interval = $date->diff($date2);
        echo "difference " . $interval->h . " hour, " . $interval->i." minutes, ".$interval->s." second";
        $sum1=strtotime($interval->h.':'.$interval->i.':'.$interval->s)-$sum;
        $sum2 = $sum2+$sum1;
        echo "<br />";
    }
    $date2 = $date;

    $x = 1;
}
$sum3=$sum+$sum2;

echo date("H:i:s",$sum3);

<强>输出

difference 0 hour, 5 minutes, 1 second
difference 0 hour, 55 minutes, 36 second
difference 0 hour, 10 minutes, 2 second
difference 1 hour, 0 minutes, 10 second
difference 0 hour, 55 minutes, 9 second
difference 0 hour, 5 minutes, 1 second
03:10:59

答案 3 :(得分:1)

这是基本脚本:

$tot = strtotime( '00:00:00' );
for( $i=1; $i<count( $array ); $i++ )
{
    $tot += strtotime( $array[$i]['ltime'] ) - strtotime( $array[$i-1]['ltime'] );
}

echo date( 'H:i:s', $tot );

将输出:

03:10:59

或:

if( $str = date('G',$tot) ) echo "$str hours ";
if( $str = date('i',$tot) ) echo "$str minutes ";

将输出:

3 hours 10 minutes

但是你要花几分钟时间,所以你需要这个:

$tot = strtotime( '00:00:00' );
for( $i=1; $i<count( $array ); $i++ )
{
    $tot += strtotime( sprintf('%s:00',substr($array[$i]['ltime'],0,5) )) - strtotime( sprintf('%s:00',substr($array[$i-1]['ltime'],0,5) ));
}

if( $str = date('G',$tot) ) echo "$str hours ";
if( $str = date('i',$tot) ) echo "$str minutes ";

将输出:

3 hours 11 minutes

答案 4 :(得分:0)

你可以比其他人建议的那样简单得多。基本上循环遍历您的数据阵列,使用H:i:s收集结果将您的strtotime()时间转换为秒,并在结尾时将其转换为H:i:s格式。

<?php

$data = [
  '00:02:55',
  '00:07:56',
  '01:03:32',
  '01:13:34',
  '02:13:44',
  '03:08:53',
  '03:13:54'
];

$totalTime = 0;

foreach ($data as $time) {
    $totalTime = $totalTime + strtotime("1970-01-01 $time UTC");
}

var_dump($totalTime); // Total Seconds
echo "Total time: " . gmdate("H:i:s", $totalTime); // H:i:s format

<强>输出

int(39868) 
Total time: 11:04:28

Fiddle