2016-04-29 3 views
0

Für das Leben von mir kann ich nirgendwo im Internet finden, dass irgendwelche Dokumentation zur Lösung meines Problems hat. Ich habe eine Menge Möglichkeiten gesehen, Unterschiede in der Zeit zu berechnen, aber ich kann nicht sagen, dass etwas zusammen passt, das für meine Situation funktioniert.PHP - Mehrere Zeitdifferenzberechnungen

Ich baue gerade ein Zeitmanagement/Ticket-System, das ein Plugin für WordPress ist. Ich verwende benutzerdefinierte Tabellen und nicht die WordPress-Tabellen. Ich habe eine Tabelle, die alle wichtigen Ticket-Informationen und eine andere Tabelle enthält, die alle Start/Stop-Zeiten enthält. Sobald der Benutzer das Ticket als vollständig markiert hat, nimmt es alle Start/Stopp-Zeitwerte und berechnet die gesamte verbrauchte Zeit und platziert dann den Gesamtzeitwert in eine Spalte "total_time" in der Hauptticktabelle.

ich die Abfrage der Datenbank und ziehen Sie die Start-/Stoppzeiten durch den Einsatz:
$start_times = $wpdb->get_results($start_times_query); $stop_times = $wpdb->get_results($stop_times_query);

Jetzt habe ich die Informationen in zwei Arrays. Soll ich das so machen?

Das gibt das Array mir diese (für Startzeiten): Array ([0] => Array ([time] => 2016-04-29 12:02:43) [1] => Array ([time] => 2016-04-29 12:04:18) [2] => Array ([time] => 2016-04-29 12:06:07) [3] => Array ([time] => 2016-04-29 12:07:56) [4] => Array ([time] => 2016-04-29 12:10:30) [5] => Array ([time] => 2016-04-29 12:11:59))

(Same-Format für die Endzeit)

Dann breche ich das Array nach unten verwenden:

$startTimes = array_column($startTimes, 'time'); 
$endTimes = array_column($endTimes, 'time'); 

, die jetzt gibt mir dies als das Array (das ist nur die Startzeiten, aber das gleiche Format für die Endzeiten):

Array ([0] => 2016-04-29 12:02:43 [1] => 2016-04-29 12:04:18 [2] => 2016-04-29 12:06:07 [3] => 2016-04-29 12:07:56 [4] => 2016-04-29 12:10:30 [5] => 2016-04-29 12:11:59) 

Normalerweise kann ich eine foreach ($start_time as $time){} machen, um durch alle Werte zu iterieren, aber (korrigiere mich, wenn ich falsch liege) Ich kann nicht zwei Arrays in die foreach Klammern setzen und ich kann keine andere foreach-Anweisung in die aktuelle setzen denn dann wird es einfach alle Zeiten für das zweite Array zurückgeben und nur einen Wert für das erste Array zurückgeben. Ich fühle mich als würde ich etwas Einfaches vermissen, was kann ich tun, um dies zu erreichen?

EDIT
Dank Scopey Ich habe eine while-Schleife ausgearbeitet, aber es richtig ist funktioniert nicht. Hier ist, was ich habe:

$startTimes = array_column($startTimes, 'time'); 
$endTimes = array_column($endTimes, 'time'); 
while (($startTime = current($startTimes)) !== false && ($endTime = current($endTimes) !== false)) { 

    $startTimesConv = strtotime($startTimes); 
    $endTimesConv = strtotime($endTimes); 
    $totalTime = ($startTimesConv - $endTimesConv)/60/60; 

    next($startTimes); 
    next($endTimes); 
} 
+0

Kann mir jemand helfen, die While-Schleife zu sortieren? – Mason

Antwort

0

Wenn Sie möchten, die gleichzeitig zwei Arrays in einer Schleife, können Sie die PHP-Funktionen für Arrays durchlaufen verwenden in ihren internen Zeiger manipulieren: current, next, reset, end und prev.

Sie müssen nur eine while-Schleife machen:

while (($startTime = current($startTimes)) !== false && ($endTime = current($endTimes) !== false) { 
    // ... Do things 

    next($startTimes); 
    next($endTimes); 
} 

finden Sie in der Dokumentation für next und current

+0

Wie würde ich eine Berechnung in die While-Schleife für ein Array wie diese setzen: Startzeiten = 'Array ([0] => Array ([Zeit] => 2016-04-29 12:02:43) [1] => Array ([Zeit] => 2016-04-29 12:04:18) [2] => Array ([Zeit] => 2016-04-29 12:06:07) [3] = > Array ([Zeit] => 2016-04-29 12:07:56) [4] => Array ([Zeit] => 2016-04-29 12:10:30) [5] => Array ([ time] => 2016-04-29 12:11:59)) ' (Gleiches Format für die Endzeiten) – Mason

+0

Sie können [' array_column'] (http://php.net/manual/en/function .array-column.php), um dieses Array auf eine einzige Dimension zu bringen: '$ startTimes = array_column ($ startTimes, 'time');' - Dann benutze einfach die while-Schleife, die ich gezeigt habe. – Scopey

+0

Okay, ich bin nah ... Hier ist, wie meine While-Schleife aussieht, aber es funktioniert nicht. Kannst du darauf hinweisen, was falsch ist? 'while (($ starttime = Strom ($ startTimes))! == false && ($ endTime = Strom (endtimes $)! == false) { \t \t \t \t \t \t \t \t \t \t \t \t $ startTimesConv = strtotime ($ startTimes); \t \t \t \t \t \t $ endTimesConv = strtotime ($ endtimes); \t \t \t \t \t \t $ totalTime = ($ startTimesConv - $ endTimesConv)/60/60; \t \t \t \t \t \t \t \t \t \t \t \t nächste ($ startTimes); \t \t \t \t \t \t nächste ($ endTimes); \t \t \t \t \t} ' – Mason

0

Ich würde einen Schritt zurück und schauen Sie sich die Anfragen selbst. Sie versuchen, eine Berechnung zwischen zwei Zeiten durchzuführen, die in Ihrer Datenbank verwandt sind, jedoch geht die Beziehung verloren, indem die Zeiten in zwei separaten Feldern aufteilen. Oder zumindest als Array-Index zweideutig verwandt.

Mein Pseudo-Code würde wie folgt aussehen:

#For each ticket which is closed 
    #Get an array (time entries) of arrays (start, stop) (each having it's start and stop time) 
    #total_time = 0 
    #For each time entry 
     #Perform a time calc function to get_time_differnce(start, stop) 
     #Add the time to Total_time 
    #Add total_time to ticket record in DB 

Wenn Sie etwas mehr Detail habe ich gezeigt, zu erweitern der Lage sein könnten. (Das heißt die Abfragen selbst)

0

iterieren zwei regelmäßige Anordnungen mit der gleichen Länge Verwendung for statt foreach:

$length = count($start_times); 
for ($i = 0; $i < $length; $i++) { 
    $start_time = $start_times[$i]["time"]; 
    $stop_time = $stop_times[$i]["time"]; 
    // do things 
} 

Aber in Ihrem Fall, empfehle ich dringend, dass die Unterschiede in den SQL zu berechnen.

+0

ich mit SQL nicht allzu vertraut bin, ich die Grundlagen kennen und wissen genug, um herumzukommen. Wie würden Sie die SQL-Route für die Berechnungen empfehlen? – Mason

+0

Verbinden Sie Ihre Abfragen und verwenden Sie DATEDIFF. Siehe https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff –