Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP关联数组,同一级别上的同一代码不';行不通_Php_Arrays_Associative - Fatal编程技术网

PHP关联数组,同一级别上的同一代码不';行不通

PHP关联数组,同一级别上的同一代码不';行不通,php,arrays,associative,Php,Arrays,Associative,我这里有个很奇怪的问题。很抱歉,这些丑陋的冗余部件,但这只是用于原型设计。在这两个模块中,我计算给定工作时间的秒数。第一个块是第一个版本,可以工作,但没有那么健壮。因此,第二个块解决了鲁棒性问题。 重要的是 $hours[$row[“gamemaster”]]=$hours[$row[“gamemaster”]]]+$worktime 在这两个块中,整数$worktime以秒为单位。但现在的问题是,在第二个块中,工作时间的总和不起作用。它处于同一级别,代码的其他部分没有变化 预期值是每个玩家的工

我这里有个很奇怪的问题。很抱歉,这些丑陋的冗余部件,但这只是用于原型设计。在这两个模块中,我计算给定工作时间的秒数。第一个块是第一个版本,可以工作,但没有那么健壮。因此,第二个块解决了鲁棒性问题。 重要的是
$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;
  }
输出$hours的第一个块:
[键]:[值]
费利克斯:8778047400
玛丽:2926018800

第二个街区:

  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;
  }
输出$hours的第二个块: 没有,就像数组中没有写入任何内容一样

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

    $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:
    $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;
我将第二个块的代码减少为

    $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:
    $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的输出为:
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:$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);

在汇总
$hours[$row[“gamemaster”]]
$worktime
之前,请进行调试打印以查看它们的精确值,并尝试理解为什么汇总“不起作用”,如您所料。如果它保持“不工作”,请最好指定“不工作”的含义…好的,sry。在这种情况下,“不工作”的意思是:我在末尾打印键值对,以查看每个玩家的工作时间。在第一个块中,它将其打印为“名称”:“小时”。但在第二个街区,它什么也不做。甚至没有向数组添加键,没有值。即使我写
$hours[$row[“gamemaster”]=$hours[$row[“gamemaster”]]+1预期值是多少?印刷价值是多少?附录值是什么?期望值是每个玩家工作时间的总和。在第一个块中,打印值是预期的时间,而在第二个块中,什么都没有发生。我最大的疑问是,总和的计算是完全相同的,只是之前工作时间的计算是不同的。如果我只在第二个块中添加普通整数,比如
$hours[$row[“gamemaster”]=$hours[$row[“gamemaster”]]+1什么都没有发生,但是对于第一个块,还有一些奇怪的东西,比如
$hours[$row[“gamemaster”]]=$hours[$row[“gamemaster”]]+“p”有效。请用我之前评论的答案更新你的问题,写下你从这两个块中得到的值…哦,谢谢,这是一个多么尴尬的错误。现在一切都按预期进行。非常感谢。相信我@datafridge-我们都去过那里,做过,得到了t恤,但我们从未从中学习;)有时需要一双新鲜的眼睛才能看到这些东西。