2016-05-12 10 views
3

私はここで本当に奇妙な問題があります。醜い冗長部分を残念に思っていますが、プロトタイピングのためだけです。両方のブロックで、私は与えられた作業時間の秒を計算します。最初のブロックは最初のバージョンで働きましたが、堅牢ではありませんでした。したがって、2番目のブロックはロバストネスの問題を解決しました。 重要な部分は $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + $worktime;PHP Associative Array、同じレベルの同じコードが動作しない

です。両方のブロックで整数$作業時間は秒です。しかし、今問題は、2番目のブロックでは、作業時間の合計が機能しないということです。それは同じレベルにあり、コードの他の部分に変更はありません。

期待値は、各ゲームマスターの勤務時間の合計です。最初のブロックでは、印刷された値は予想通りの時間であり、2番目のブロックでは何も起こりません。そして私の大きな疑問は、合計の計算はまったく同じで、前の作業時間の計算だけが異なるということです。そして、もし私が$hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + 1;のように2番目のブロックに普通の整数だけを加えたとしても、最初のブロックについては、$hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + "p";のような何か変わったことも起こります。

最初のブロック:
[キー]:[値]
フェリックス:8778047400
マリー:2926018800

第二のブロック:

$時間

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

出力最初のブロック

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

出力$時間の第二のブロック: 何も、何等は更新1

配列で書かれている: は、私は

に第2ブロックのコードを減らす

$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: 

に第2ブロックのコードを減らします
1:7200
各反復があるのafer

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

は8セット以上の反復と$ worktime用の出力があります3210 2:5400
3:5400
4:7200
5:7200
6:7200
7:5400
8:5400

しかし$時間にエントリがまだ存在しません。

+0

[$行[「ゲームマスター」]]'と '$のworktime'、その正確な値を確認するために、デバッグプリントを行い、合計は「動作しない理由を理解しようあなたが期待しているように。それが「うまくいかない」場合は、「うまくいかない」とはどういう意味なのかを具体的に指定してください。 – MarcoS

+0

大丈夫です。この場合、「動作しない」とは、各ゲームマスターの作業時間を確認するために、最後にキーと値のペアを印刷します。最初のブロックでは、 "name": "hours"のように出力します。しかし、2番目のブロックでは何もしません。値を指定せずに配列にキーを追加することさえできません。 $$ [$ row ["gamemaster"]] = $ hours [$ row ["gamemaster"]] + 1; – datafridge

+0

期待値は何ですか?印刷された価値は何ですか? addendaの値は何ですか? – MarcoS

答えて

1

sscanfコール内で$hours変数を上書きしている問題があります。 `$時間を合計する前に

$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

どうもありがとうございました。今はすべてが期待どおりに機能しています。どうもありがとうございます。 – datafridge

+0

私は@datafridgeを信じています - 私たちはすべてそこにいました、それをして、Tシャツを手に入れました、そして、私たちは決してそれから学ばない;)時には、 – Gavin

関連する問題