从数组 - php 计算总小时数


Calculate total hours from Array - php

我的数组看起来像这样

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

这实际上是找到所有值的总和时差。

给定的数据顺序是 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));

看看下面的解决方案:

$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

试试这个函数:

function totalTime($times=array()) {
     if(!is_array($times)) {
         $times = array($times);
     }
     $seconds = 0;
     foreach ($times as $time) {
       list($hour,$minute,$second) = explode(':', $time);
       $seconds += $hour*3600;
       $seconds += $minute*60;
       $seconds += $second;
     }
     $hours = floor($seconds / 3600);
     $seconds -= $hours * 3600;
     $minutes  = floor($seconds / 60);
     $seconds -= $minutes * 60;
     // return "{$hours}:{$minutes}:{$seconds}";
     return sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);
}

$yourArray = array(...);
//clean your array, so each array value will be a duration
echo totalTime($yourArray);

这是基本脚本:

$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

你可以比其他人建议的简单得多。基本上循环遍历您的数据数组,使用收集结果将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

小提琴