2017-08-31 7 views
1

Ich muss einen Code erstellen, der den Wert von $ time [1] nimmt und den Wert von $ time [2] subtrahiert, dann den Wert von $ time [3] nimmt und den Wert subtrahiert Wert von $ time [4] und so weiter, bis keine $ -Zeitdaten mehr vorhanden sind. Es sollte eine laufende Summe behalten.Auswählen von Paaren von Datensätzen php array

Mock Daten:

$time[1] = "2017-08-28 18:30:00"; 
$time[2] = "2017-08-28 14:00:00"; 
$time[3] = "2017-08-28 13:00:00"; 
$time[4] = "2017-08-28 12:45:00"; 
$time[5] = "2017-08-28 12:30:00"; 
$time[6] = "2017-08-28 12:00:00"; 

Zum Beispiel: [1] - [2] = 4,5 h [3] - [4] = 0,25 Stunden, [5] - [6] = 0,5 Stunden; Gesamt = 5,25 Stunden.

$hourdiff = round((strtotime($time[1]) - strtotime($time[2]))/3600, 1); //gives you the quantity of hours worked between 2 records 

Ich muß einen Weg Datensätze auszuwählen 1 und 2, den $ hourdiff zu berechnen, fügen Sie ihn in der laufenden Summe, dann Datensätze auswählen 3 und 4, den $ hourdiff berechnen, fügen Sie ihn in der laufenden Summe, etc. bis keine Daten mehr zu berechnen sind.

Antwort

1

Es klingt wie du bist Suche eine for Schleife:

for ($i = 1; $i <= count($time) - 1; $i++) { 
    $hourdiff = round((strtotime($time[$i + 1]) - strtotime($time[$i]))/3600, 1); 
    echo "The difference is: $hourdiff" . "<br />"; 
} 

Dies wird alle fünf Unterschiede in der Zeit echo aus.

Beachten Sie, dass Sie mit dem $i bei 1 beginnen müssen, da Sie nichts vom ersten Ereignis subtrahieren können! Um dem entgegenzuwirken, müssen Sie den Index kurz vor der Zählung stoppen.

Dies funktioniert here funktioniert.

Hoffe, das hilft! :)

+0

Aha vielen Dank für diese "for" -Schleife, es war das fehlende Stück und ich habe nicht ganz verstanden, wie es funktionieren sollte (ob es eine While-Schleife oder eine For- oder Foreach-Schleife oder was auch immer sein sollte) .Ich habe gerade "$ x = $ x + 1" am Ende der Schleife hinzugefügt und jetzt berechnet es nur den Unterschied zwischen den Aufzeichnungen in Paaren, wie ich brauche. So sehr geschätzt! –

0

Iterate durch das Array, sondern 1 zu dem Iterieren Variable hinzuzufügen, fügen Sie zwei (und prüfen Sie die außerhalb der Grenzen Fehler):

<?php 
$time[0] = "2017-08-28 18:30:00"; 
$time[1] = "2017-08-28 14:00:00"; 
$time[2] = "2017-08-28 13:00:00"; 
$time[3] = "2017-08-28 12:45:00"; 
$time[4] = "2017-08-28 12:30:00"; 
$time[5] = "2017-08-28 12:00:00"; 
$total = 0; 
for ($i = 0; $i < count($time); $i += 2) { 
    if ($i + 1 > count($time) - 1) break; // check of out of bounds 
    $total += round((strtotime($time[$i]) - strtotime($time[$i + 1]))/3600, 1); // add diff of next two numbers 
} 
echo $total; 

Demo

0

Versuchen mit:

$time[1] = "2017-08-28 18:30:00"; 
$time[2] = "2017-08-28 14:00:00"; 
$time[3] = "2017-08-28 13:00:00"; 
$time[4] = "2017-08-28 12:45:00"; 
$time[5] = "2017-08-28 12:30:00"; 
$time[6] = "2017-08-28 12:00:00"; 

$times = array(); 

$total = 0; 

foreach ($time as $n => $t0) { 
    if ($n % 2) { 
     continue; 
    } 
    $t1 = strtotime($time[$n - 1]); 
    $t2 = strtotime($t0); 
    $k = sprintf('%s-%s', $n - 1, $n); 
    $diff = ($t1 - $t2)/3600; 
    $times[$k] = sprintf('%.2f hours', $diff); 
    $total += $diff; 
} 


print_r($times); 
printf('TOTAL : %s hours', $total); 

Ausgabe

Array 
(
    [1-2] => 4.50 hours 
    [3-4] => 0.25 hours 
    [5-6] => 0.50 hours 
) 
TOTAL : 5.25 hours 

Oder yo mit versuchen DateTime::diff

$time[1] = "2017-08-28 18:30:00"; 
$time[2] = "2017-08-28 14:00:00"; 
$time[3] = "2017-08-28 13:00:00"; 
$time[4] = "2017-08-28 12:45:00"; 
$time[5] = "2017-08-28 12:30:00"; 
$time[6] = "2017-08-28 12:00:00"; 

$times = array(); 

$total = new DateTime; 

foreach ($time as $n => $t0) { 
    if ($n % 2) { 
     continue; 
    } 
    $t1 = new DateTime($time[$n - 1]); 
    $t2 = new DateTime($t0); 
    $k = sprintf('%s-%s', $n - 1, $n); 
    $diff = $t1->diff($t2); 
    $times[$k] = $diff->format('%h hour(s) %i min(s) %s sec(s)'); 
    $total = $total->add($diff); 
} 

$total = ($total->diff(new DateTime))->format('%h hour(s) %i min(s) %s sec(s)'); 

print_r($times); 
printf('TOTAL : %s', $total); 

Ausgabe

Array 
(
    [1-2] => 4 hour(s) 30 min(s) 0 sec(s) 
    [3-4] => 0 hour(s) 15 min(s) 0 sec(s) 
    [5-6] => 0 hour(s) 30 min(s) 0 sec(s) 
) 
TOTAL : 5 hour(s) 15 min(s) 0 sec(s) 
0

Verwenden array_chunk zur Gruppe in Paare, summiert array_reduce um dann die Unterschiede:

$total = array_reduce(
    array_chunk($time, 2), 
    function ($total, $pair) { 
     return $total + (strtotime($pair[0]) - strtotime($pair[1])); 
    }, 
    0 
); 

See it online at 3v4l.org.

Der Eingang $time ist ein Array von zeitlich wie Saiten, geeignet für die zu strtotime vorbei. Die resultierende $total wird eine ganze Zahl von Sekunden sein.

Verwandte Themen