PHP 关联数组,同一级别的相同代码不起作用

PHP Associative Array, same code on same level doesn't work

我这里有一个非常奇怪的问题。对不起丑陋的冗余部分,但它仅用于原型制作。在这两个块中,我计算给定工作时间的秒数。第一个块是第一个版本并且可以工作,但不是那么健壮。所以第二块解决了鲁棒性问题。 重要的部分是 $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + $worktime;

在这两个块中,整数 $worktime 以秒为单位。但现在的问题是,在第二个块中,工作时间的总和不起作用。同级别,其他部分代码没有变化。

预期值是每个游戏管理员的工作时间总和。在第一个块中,打印值是预期的时间,在第二个块中没有任何反应。而我的大问号是,总和的计算完全相同,只是之前工作时间的计算不同。如果我在第二个块中只添加普通整数,如 $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + 1; 什么也不会发生,但对于第一个块,也有一些奇怪的东西,如 $hours[$row["gamemaster"]] = $hours[$row["gamemaster"]] + "p"; 起作用。

第一块:

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

输出第一个块 $小时:
[键]:[值]
Felix:8778047400
Marie:2926018800

第二块:

  if($row["no_game"]==0) {
    $str_time = $row["additional"];
    $str_time = preg_replace("/^([\d]{1,2})\:([\d]{2})$/", "00::", $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::", $str_time);
    sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds);
    $worktime = $hours * 3600 + $minutes * 60 + $seconds;

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

输出第二块 $hours: 什么都没有,就像数组里什么都没写一样

更新 1: 我将第二个块的代码减少到

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

我将第二块的代码缩减为

    $str_time = $row["additional"];
    $str_time = preg_replace("/^([\d]{1,2})\:([\d]{2})$/", "00::", $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 的输出为:
1: 7200
2: 5400
3: 5400
4: 7200
5: 7200
6: 7200
7: 5400
8: 5400

但是 $hours 还是没有条目。

问题是您在 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::", $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);