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);
我这里有一个非常奇怪的问题。对不起丑陋的冗余部分,但它仅用于原型制作。在这两个块中,我计算给定工作时间的秒数。第一个块是第一个版本并且可以工作,但不是那么健壮。所以第二块解决了鲁棒性问题。
重要的部分是
$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);