2016-05-12 2 views
3

Ich habe ein wirklich seltsames Problem hier. Sorry für die hässlichen überflüssigen Teile, aber es ist nur für das Prototyping. In beiden Blöcken berechne ich die Sekunden der gegebenen Arbeitszeit. Der erste Block war die erste Version und funktionierte, war aber nicht so robust. So löste der zweite Block das Robustheitsproblem. Der wichtige Teil ist $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + $worktime;PHP Associative Array, der gleiche Code auf der gleichen Ebene funktioniert nicht

In beiden Blöcken ist die ganze Zahl $ Arbeitszeit in Sekunden. Aber jetzt ist das Problem, dass im zweiten Block die Summe der Arbeitszeit nicht funktioniert. Es ist auf der gleichen Ebene und es gibt keine Änderungen an anderen Teilen des Codes.

Der erwartete Wert ist die Summe der Arbeitsstunden für jeden Spielleiter. Im ersten Block ist der gedruckte Wert die erwartete Zeit und im zweiten Block passiert nichts. Und mein großes Fragezeichen ist, dass die Berechnung der Summe genau gleich ist und nur die Berechnung der Arbeitszeit vorher anders ist. Und wenn ich nur normale Ganzzahlen im zweiten Block wie $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + 1; hinzufügen passiert nichts, aber für den ersten Block, auch etwas seltsam wie $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + "p"; gearbeitet.

erster Block:

if($row["no_game"]==0) { 
    $worktime = strtotime($row["additional"]); 
    $worktime = $worktime + 5400; 

    $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + $worktime; 
    } 
    else { 
    $worktime = strtotime($row["additional"]); 

    $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + $worktime; 
    } 

Ausgang erster Block für $ Stunden:
[key]: [Wert]
Felix: 8778047400
Marie: 2926018800

zweiter Block:

if($row["no_game"]==0) { 
    $str_time = $row["additional"]; 
    $str_time = preg_replace("/^([\d]{1,2})\:([\d]{2})$/", "00:$1:$2", $str_time); 
    sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds); 
    $time_seconds = $hours * 3600 + $minutes * 60 + $seconds; 
    $worktime = $time_seconds + 5400; 

    $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + $worktime; 
    } 
    else { 
    $str_time = $row["additional"]; 
    $str_time = preg_replace("/^([\d]{1,2})\:([\d]{2})$/", "00:$1:$2", $str_time); 
    sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds); 
    $worktime = $hours * 3600 + $minutes * 60 + $seconds; 

    $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + $worktime; 
    } 

Ausgabe zweiter Block für Stunden $: Nichts, wie nichts in dem Array geschrieben

Update 1: ich den Code des zweiten Blockes reduzieren zu

$str_time = $row["additional"]; 
    $str_time = preg_replace("/^([\d]{1,2})\:([\d]{2})$/", "00:$1:$2", $str_time); 
    sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds); 
    $time_seconds = $hours * 3600 + $minutes * 60 + $seconds; 
    $worktime = $time_seconds + 5400;Update 1: 

ich den Code des zweiten Blockes zu

reduzieren
$str_time = $row["additional"]; 
    $str_time = preg_replace("/^([\d]{1,2})\:([\d]{2})$/", "00:$1:$2", $str_time); 
    sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds); 
    $time_seconds = $hours * 3600 + $minutes * 60 + $seconds; 
    $worktime = $time_seconds + 5400; 
    $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + $worktime; 

Es gibt 8 Iterationen über den Datensatz und die Ausgabe für Arbeitszeit- $ afer jede Iteration:
1: 7200
2: 5400
3: 5400
4: 7200
5: 7200
6: 7200
7: 5400
8: 5400

Aber es gibt noch keinen Eintrag in $ Stunden.

+0

Vor Aufsummierung '$ Stunden [$ row [„Spielleiter“]]' und '$ worktime', eine Debug-Druck machen ihre genauen Werte zu sehen, und versuchen zu verstehen, warum die Summe„funktioniert nicht "wie du es erwartest. Wenn es "nicht funktioniert", bitte besser angeben, was "nicht funktioniert" bedeutet ... – MarcoS

+0

in Ordnung sry. In diesem Fall bedeutet "nicht arbeiten": Ich drucke am Ende das Schlüssel-Wert-Paar, um die Arbeitsstunden für jeden Spielleiter zu sehen.Im ersten Block wird wie erwartet gedruckt: "Name": "Stunden". Aber im zweiten Block tut es nichts. Fügen Sie dem Array keinen Schlüssel ohne Wert hinzu. Selbst wenn ich '$ hours [$ row [" gamemaster "]] = $ hours [$ row [" gamemaster "]] + 1;' – datafridge

+0

schreiben Was ist der erwartete Wert? Was ist der gedruckte Wert? Was sind die Addenda-Werte? – MarcoS

Antwort

1

Das Problem besteht darin, dass Sie die $hours Variable in Ihrem sscanf Anruf überschreiben.

$rows = [ 
    ['gamemaster' => 1, 'additional' => '00:30:00', 'no_game' => 0], 
    ['gamemaster' => 2, 'additional' => '00:10:30', 'no_game' => 0], 
    ['gamemaster' => 3, 'additional' => '00:20:00', 'no_game' => 0], 
    ['gamemaster' => 1, 'additional' => '00:40:40', 'no_game' => 1], 
    ['gamemaster' => 2, 'additional' => '00:15:00', 'no_game' => 1], 
    ['gamemaster' => 3, 'additional' => '00:00:30', 'no_game' => 1], 
    ['gamemaster' => 1, 'additional' => '00:00:10', 'no_game' => 0], 
    ['gamemaster' => 2, 'additional' => '00:20:30', 'no_game' => 0], 
    ['gamemaster' => 3, 'additional' => '00:00:00', 'no_game' => 0], 
    ['gamemaster' => 1, 'additional' => '00:05:00', 'no_game' => 1], 
    ['gamemaster' => 2, 'additional' => '00:09:40', 'no_game' => 1], 
    ['gamemaster' => 3, 'additional' => '00:18:30', 'no_game' => 1], 
    ['gamemaster' => 1, 'additional' => '00:34:30', 'no_game' => 0], 
    ['gamemaster' => 2, 'additional' => '00:59:59', 'no_game' => 0], 
    ['gamemaster' => 3, 'additional' => '00:40:00', 'no_game' => 0] 
]; 

$result = array(); 

foreach ($rows as $row) { 
    $str_time = preg_replace('/^([\d]{1,2})\:([\d]{2})$/', "00:$1:$2", $row['additional']); 
    sscanf($str_time, '%d:%d:%d', $hours, $minutes, $seconds); 
    $worktime = $hours * 3600 + $minutes * 60 + $seconds; 
    if (!$row['no_game']) { 
     $worktime += 5400; 
    } 
    if (!isset($hours[$row['gamemaster']])) { 
     $result[$row['gamemaster']] = 0; 
    } 
    $result[$row['gamemaster']] += $worktime; 
} 

var_dump($result); 
+0

Oh danke, was für ein peinlicher Fehler. Jetzt funktioniert alles wie erwartet. Ich danke dir sehr. – datafridge

+0

Glaub mir @datafridge - wir waren alle da, haben es gemacht und haben das T-Shirt bekommen und wir lernen nie davon;) Manchmal braucht es ein frisches Paar Augen, nur um diese Dinge zu sehen. – Gavin