修改2D数组中的行,使得日期时间戳连续。
修改2D数组中的行,使得日期时间戳连续。
我有一个二维数组,每个任务包含一个开始时间,一个结束时间(始终在开始时间之后60分钟),然后是一个“add”值,表示下一个任务应该开始的分钟数。
我需要调整所有行,使每个开始时间为前一个任务的结束时间加上其“add”时间。
这是一个示例数组:
[ [ 'id' => 9, 'needed_at' => '2023-02-26 03:31:04', 'ended_at' => '2023-02-26 04:31:04', 'add' => 20 ], [ 'id' => 6, 'needed_at' => '2023-02-26 04:51:04', 'ended_at' => '2023-02-26 05:51:04', 'add' => 30 ], [ 'id' => 7, 'needed_at' => '2023-02-26 09:21:04', 'ended_at' => '2023-02-26 10:21:04', 'add' => 30 ] ]
我的期望结果是:
[ [ 'id' => 9, 'needed_at' => '2023-02-26 03:31:04', 'ended_at' => '2023-02-26 04:31:04', 'add' => 20 ], [ 'id' => 6, 'needed_at' => '2023-02-26 04:51:04', 'ended_at' => '2023-02-26 05:51:04', 'add' => 30 ], [ 'id' => 7, 'needed_at' => '2023-02-26 06:21:04', # 根据id 6的数据更改 'ended_at' => '2023-02-26 07:21:04', # 根据此行的新need_at时间更改 'add' => 30 # 实际上未使用,因为没有下一个任务 ] ]
我尝试过:
foreach ($jobs as $k => $j) { $s = $k+1; $date = new \DateTimeImmutable($j->ended_at); $add = $j->add; $date_new = $date->modify('+'.$add.' minutes'); $needed_at = $date_new->format('Y-m-d H:i:s'); $data['needed_at'] = $needed_at; $date2 = new \DateTimeImmutable($needed_at); $ended_at = $date2->modify('+60 minutes'); $data['ended_at'] = $ended_at->format('Y-m-d H:i:s'); $d[]=[ 'id' => $jobs[$s]->id, 'needed_at' => $needed_at, 'ended_at' => $data['ended_at'], 'add' => $add ]; }
它没有起作用。是否可能在第一次迭代中使用修改后的数据进行第二次迭代?
问题的原因是在一个二维数组中修改行,使得时间戳连续。解决方法是通过对数组进行循环迭代,根据特定的算法修改时间戳的值,并将结果存储在新的数组中。
首先,定义了一个格式化字符串$format = 'Y-m-d H:i:s';
,并初始化了两个变量$ended_at
和$add
,分别用于保存当前行的结束时间和增加的分钟数。
然后,通过foreach
循环遍历数组的每一行。在循环中,首先判断是否是第一行,如果是则跳过该次循环。然后,使用DateTimeImmutable::createFromFormat
函数将结束时间转换为DateTimeImmutable
对象,并通过modify
方法增加指定的分钟数。接着,再通过modify
方法增加60分钟,并将结果格式化为指定的格式。最后,将修改后的数据存储在新的数组$d
中,并更新$ended_at
和$add
的值为当前行的结束时间和增加的分钟数。
最后,通过print_r
函数输出修改后的数组$d
。
作者感谢他人的帮助,但发现输出结果与预期不符。他提供了一个在线演示,希望其他人能够帮忙找出问题所在。他指出第二行的结束时间是2023-02-26 05:51:04
,因此第三行的needed_at
应该是2023-02-26 06:21:04
。他希望确认自己的理解是否正确,并提供了在线演示的链接。
其他人查看了演示后发现问题所在,并指出作者在代码中遗漏了一处错误。作者感谢他的提醒,并表示问题已经解决。
最后,其他人提出了一个好的建议,建议作者在代码中使用$format
变量3次。作者表示已经更新了代码,并指出$d
是预期的输出结果。
问题的出现原因是需要将一个二维数组中的时间戳进行连续排列。解决方法是通过使用一个循环,通过引用修改行,声明一个单一的日期时间对象,然后根据需要进行日期时间戳的增加或保存。可以避免浪费/翻倍的内存来构建一个全新的输出数组。
具体的代码如下:
$format = 'Y-m-d H:i:s'; foreach ($jobs as &$row) { $dt ??= new DateTime($row['needed_at']); // 如果尚未声明,则进行声明 $row['needed_at'] = $dt->format($format); // 以所需的格式保存 $dt->modify('+ 60 minutes'); // 按分钟进行增加 $row['ended_at'] = $dt->format($format); // 以所需的格式保存 $dt->modify("+ {$row['add']} minutes"); // 按间隔的分钟进行增加,为下一行准备 } var_export($jobs);
通过以上的代码,我们可以对二维数组中的时间戳进行连续排列。