如何将单日时间数组拆分为两个同日期独立数组(PHP代码问题求助)
解决PHP数组拆分问题:将单日期多时间组拆分为多组日期-时间结构
看起来你需要把一个包含单个日期和多组时间的数组,拆分成多个独立的数组条目,每个条目都保留相同的日期并对应一组时间。我来帮你梳理问题并给出修正方案:
问题分析
你现有代码的核心问题在于:
- 使用
$timesDosen4[$i]['hours'][$y]的赋值方式,是把多组时间塞到同一个数组的hours字段里,而不是生成独立的数组条目 - 变量
$i没有正确递增,导致每次循环都会覆盖同一个索引的元素,最终只显示最后一组数据 - 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') ) ] ]; } } }
关键修改说明
- 去掉了
$i和$y变量,直接用$timesDosen4[] = ...追加新的数组条目,确保每一组时间都生成独立元素 - 使用Carbon的
copy()方法,避免修改原始日期实例(Carbon是可变对象,直接修改会影响后续逻辑) - 每次生成时间组时,都直接构建完整的
dates+hours结构,完全符合你的需求格式
运行这段代码后,$timesDosen4就会是你期望的数组结构,不会再出现覆盖或日期不生效的问题。
内容的提问来源于stack exchange,提问作者Muhammad Amin Rais
相关产品推荐
相关产品推荐

