修改2D数组中的行,使得日期时间戳连续。

5 浏览
0 Comments

修改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
    ];
}

它没有起作用。是否可能在第一次迭代中使用修改后的数据进行第二次迭代?

0
0 Comments

问题的原因是在一个二维数组中修改行,使得时间戳连续。解决方法是通过对数组进行循环迭代,根据特定的算法修改时间戳的值,并将结果存储在新的数组中。

首先,定义了一个格式化字符串$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是预期的输出结果。

0
0 Comments

问题的出现原因是需要将一个二维数组中的时间戳进行连续排列。解决方法是通过使用一个循环,通过引用修改行,声明一个单一的日期时间对象,然后根据需要进行日期时间戳的增加或保存。可以避免浪费/翻倍的内存来构建一个全新的输出数组。

具体的代码如下:

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

通过以上的代码,我们可以对二维数组中的时间戳进行连续排列。

0