我的数组看起来像这样
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
这实际上是找出所有值之和的时差。
答案 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