我有一个如下所示的数组

Array
(
[0] => Array
    (
        [id] => 9
        [needed_at] => 2023-02-26 03:31:04
        [ended_at] => 2023-02-26 04:31:04
        [add] => 20
    )

[1] => Array
    (
        [id] => 6
        [needed_at] => 2023-02-26 04:51:04
        [ended_at] => 2023-02-26 05:51:04
        [add] => 30
    )

[2] => Array
    (
        [id] => 7
        [needed_at] => 2023-02-26 09:21:04
        [ended_at] => 2023-02-26 10:21:04
        [add] => 30
    )

)

现在在一个循环中,我想修改0索引中的ended_at,然后使用这个修改后的ended_at来替换1索引中的needed_at.在这种方式下,还想用1个索引的修改后的ended_at等替换2个索引

我试过的是

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

}

这不管用.是否可以将第一次迭代修改后的数据用于第二次迭代?需要帮助

我的预期结果是

Array
(
[0] => Array
    (
        [id] => 9
        [needed_at] => 2023-02-26 03:31:04
        [ended_at] => 2023-02-26 04:31:04
        [add] => 20
    )

[1] => Array
    (
        [id] => 6
        [needed_at] => 2023-02-26 04:51:04
        [ended_at] => 2023-02-26 05:51:04
        [add] => 30
    )

[2] => Array
    (
        [id] => 7
        [needed_at] => 2023-02-26 06:21:04
        [ended_at] => 2023-02-26 07:21:04
        [add] => 30
    )

)

推荐答案

由于数组的第一个元素不会更改,因此我们将其排除在循环之外.

要获得预期的输出,有两个元素很重要:ended_atadd,然后在每次迭代后,这些变量将采用当前值,依此类推

$format = 'Y-m-d H:i:s';

$ended_at = $jobs[0]['ended_at'];
$add = $jobs[0]['add'];

$d[0] = $jobs[0];
foreach($jobs as $k => $j){
       if ($k < 1) continue;
       
       $ended_at = DateTimeImmutable::createFromFormat($format, $ended_at);
       
       $ended = $ended_at->modify('+'.$add.' minutes');
       $needed = $ended->modify('+60 minutes');
       
       $ended = $ended->format($format);
       $needed = $needed->format($format);
       
       $d[]=array(
         'id' => $jobs[$k]['id'],
         'needed_at' => $ended,
         'ended_at' => $needed,
         'add' => $jobs[$k]['add']
       );
       
       $ended_at = $needed;
       $add = $jobs[$k]['add'];
       
}

print_r($d);

Demo here

Php相关问答推荐

Laravel迁移返回SQL错误,但SQL有效且工作正常

在WooCommerce管理订单页面中显示区域名称

向在添加到购物车上动态创建的WooCommerce产品添加发货类别

具有重叠捕获组的PHP正则表达式

在WooCommerce产品中按类型对产品属性术语进行分类以供显示

无法使用php IMAP从Gmail获取收件箱

Codeigniter 4中的未定义变量$HOME

文件::Files()响应返回空对象数组

根据WooCommerce的定制订单状态增加产品库存

根据页面以及是否在促销,向 WooCommerce 中显示的价格添加前缀

如何使用 PHP 将带有图像的文本上传到 Linkedin?

多个产品类别 Select 自定义 WooCommerce 插件设置页面

如何从 URL 核心 PHP 中的 API 获取 JSON?

在 DateTime 或 DateTimeImmutable 对象上调用modify() 时是否必须使用空格?

如何在 PHP 中对具有相同数组值的值求和

防止使用woocommerce_checkout_process下单

如何通过工厂为点列制作一个假坐标?

Google Drive - 仅使用 FileID 获取文件的 FileSize

为什么 PDO 允许使用带命名占位符的索引数组,但仅在禁用仿真时才允许?

使用 OOP PHP 创建动态 WHERE 子句.如何实现 BETWEEN 运算符?