You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将单日时间数组拆分为两个同日期独立数组(PHP代码问题求助)

解决PHP数组拆分问题:将单日期多时间组拆分为多组日期-时间结构

看起来你需要把一个包含单个日期和多组时间的数组,拆分成多个独立的数组条目,每个条目都保留相同的日期并对应一组时间。我来帮你梳理问题并给出修正方案:

问题分析

你现有代码的核心问题在于:

  1. 使用$timesDosen4[$i]['hours'][$y]的赋值方式,是把多组时间塞到同一个数组的hours字段里,而不是生成独立的数组条目
  2. 变量$i没有正确递增,导致每次循环都会覆盖同一个索引的元素,最终只显示最后一组数据
  3. Carbon日期对象是可变的,直接修改会污染原始实例,可能导致日期赋值错误

方案1:直接拆分已有的原始数组

如果你已经拿到了开头描述的原始数组(包含dates和多组hours),可以用这段简单的代码完成拆分:

// 假设这是你的原始数组
$originalData = [
    'dates' => '2021-10-20',
    'hours' => [
        [
            '07:30', '08:00', '08:30', '09:00', '09:30',
            '10:00', '10:30', '11:00', '11:30', '12:00',
            '12:30', '13:00'
        ],
        [
            '15:30', '16:00', '16:30', '17:00'
        ]
    ]
];

$result = [];
// 遍历每一组时间,生成独立的日期-时间数组
foreach ($originalData['hours'] as $hourGroup) {
    $result[] = [
        'dates' => $originalData['dates'],
        'hours' => [$hourGroup] // 保持hours的二维数组结构,符合你的需求
    ];
}

// 输出结果
print_r($result);

这段代码会直接生成你期望的结构:每个元素都是独立的数组,包含相同的日期和对应的单组时间。


方案2:修正你的数据库查询逻辑

针对你现有业务代码,调整赋值逻辑,让生成的数组直接符合需求:

// 先初始化结果数组
$timesDosen4 = [];

if ($cekWaktuDosen4->num_rows == 0) {
    // 无数据时,直接生成完整的数组条目
    $timesDosen4[] = [
        'dates' => $dates,
        'hours' => [
            [
                '07:30', '08:00', '08:30', '09:00', '09:30',
                '10:00', '10:30', '11:00', '11:30', '12:00',
                '12:30', '13:00', '13:30', '14:00', '14:30',
                '15:00', '15:30', '16:00', '16:30', '17:00'
            ]
        ]
    ];
} else {
    while ($k = $cekWaktuDosen4->fetch_object()) {
        // 使用createFromFormat简化日期解析,同时用copy()避免修改原始Carbon实例
        $tglMulaiDosen4 = $carbon->createFromFormat('Y-m-d', $carbon->parse($k->tanggal_mulai)->format('Y-m-d'));
        $tglSelesaiDosen4 = $carbon->createFromFormat('Y-m-d', $carbon->parse($k->tanggal_selesai)->format('Y-m-d'));
        
        // 复制实例后再修改,避免污染原始日期
        $tglBantuMulai4 = $tglMulaiDosen4->copy()->addHours(7)->addMinutes(30);
        $tglBantuSelesai4 = $tglSelesaiDosen4->copy()->addHours(17);

        if ($tglBantuMulai4 < $k->tanggal_mulai) {
            // 生成第一组独立的日期-时间数组
            $timesDosen4[] = [
                'dates' => $tglMulaiDosen4->format('Y-m-d'),
                'hours' => [
                    create_time_range(
                        $tglBantuMulai4->format('H:i'),
                        rounddown_timestamp($carbon->parse($k->tanggal_mulai)->format('H:i'))
                    )
                ]
            ];

            if ($k->tanggal_selesai < $tglBantuSelesai4) {
                // 生成第二组独立的日期-时间数组
                $timesDosen4[] = [
                    'dates' => $tglMulaiDosen4->format('Y-m-d'),
                    'hours' => [
                        create_time_range(
                            roundup_timestamp($carbon->parse($k->tanggal_selesai)->format('H:i')),
                            $tglBantuSelesai4->format('H:i')
                        )
                    ]
                ];
            }
        } elseif ($tglBantuMulai4 == $k->tanggal_mulai && $tglBantuSelesai4 != $k->tanggal_selesai) {
            // 生成单组独立的日期-时间数组
            $timesDosen4[] = [
                'dates' => $tglMulaiDosen4->format('Y-m-d'),
                'hours' => [
                    create_time_range(
                        roundup_timestamp($carbon->parse($k->tanggal_selesai)->format('H:i')),
                        $tglBantuSelesai4->format('H:i')
                    )
                ]
            ];
        }
    }
}

关键修改说明

  1. 去掉了$i和$y变量,直接用$timesDosen4[] = ...追加新的数组条目,确保每一组时间都生成独立元素
  2. 使用Carbon的copy()方法,避免修改原始日期实例(Carbon是可变对象,直接修改会影响后续逻辑)
  3. 每次生成时间组时,都直接构建完整的dates+hours结构,完全符合你的需求格式

运行这段代码后,$timesDosen4就会是你期望的数组结构,不会再出现覆盖或日期不生效的问题。

内容的提问来源于stack exchange,提问作者Muhammad Amin Rais

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:56:04