2016-04-06 14 views
2

Meine Array wie dieseberechnen Gesamtstunden von 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 
     )  
) 

sehen, wie berechne ich total Stunden [ltime] aus diesem Array. Das ist, was ich

$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; 
} 

versucht haben, die nicht funktioniert. Wie man das erreicht.

EDIT

Dies ist, was genau ich will.

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 

Dies ist eigentlich Zeitdifferenz die Summe aller Werte zu finden.

+0

Was "01.03.32" bedeutet in 'LTIME'? Ist es "Stunden: Minuten: Sekunden" Zeitformat? –

+0

ja .. Stunden: Minuten: Sekunden – Matarishvan

+0

http://stackoverflow.com/questions/22681725/how-to-sum-n-number-of-time-hhmm-format Dieser Link kann Ihnen helfen, anders ist, Sie haben eine multi-multidimensionales Array und glaube, dass Sie wissen, wie Sie über das multidimensionale Array iterieren. – Meathanjay

Antwort

2

die angegebene Reihenfolge der Daten low -> high ist. Für die Berechnung der zunehmenden Zeit habe ich es reverse gemacht oder Sie können auch anders versuchen.

Aber das Wichtigste ist, die Zeit im gängigen Format zu bekommen - unix timestamp. Wir verwenden dafür strtotime(). Der Rest wird berechnet.

Der folgende Code gibt das erwartete Ergebnis an.

$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

Versuchen Sie, diese Funktion:

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); 
0

Sie dies tun können viel einfacher, als die anderen Jungs vor. Im Grunde Schleife über Ihre Daten-Array, konvertieren Sie Ihre H:i:s Zeit in Sekunden mit strtotime() sammeln Ergebnisse und konvertieren Sie es in H:i:s Format am Ende.

<?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 

Ausgabe

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

Fiddle

+0

@Daan weil ich verschiedene Daten für dieses Beispiel verwendet, Ausgabe wird korrekt sein. – Tomasz

1

Hier finden Sie unten Lösung:

$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); 

Ausgang:

11:04:28 

Die obige Lösung war für die Summe der Zeit.

UPDATE

Siehe zum gewünschten Ergebnis unterhalb Lösung:

$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); 

Output

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 
+0

finden Sie die Änderung in meiner Frage – Matarishvan

1

Dies ist die grundlegende Skript:

$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); 

AUSGABE:

03:10:59 

oder:

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

AUSGABE:

3 hours 10 minutes 

Aber du Minuten abrunden, so müssen Sie dies:

$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 "; 

AUSGABE:

3 hours 11 minutes