我有一个以这种方式组织的时间列表:
Array (
[0] => Array (
[0] => 08:30
[1] => 09:00
[2] => 09:30
[3] => 10:00
[4] => 14:30
[5] => 15:00
[6] => 15:30
[7] => 16:00
[8] => 16:30
)
[1] => Array (
[0] => 13:30
[1] => 14:00
[2] => 14:30
[3] => 18:00
[4] => 18:30
[5] => 19:00
)
)
我正在尝试将它们转换为这种格式:
'0': [['08:30','10:00'], ['14:30', '16:30']],
'1': [['13:30','14:30'], ['18:00', '19:00']]
jQuery 插件正在使用(日安排选择器)。
如果时间差大于:30 分钟,则范围包含在方括号内。
我在 PHP 中找不到此类问题的解决方案。
这是我尝试过的:
$prepared = '';
foreach($serialized as $day=>$hours) {
$prepared_hours = array();
foreach($hours as $hour) {
$prepared_hours[] = "['". $hour ."']";
}
$prepared .= "'{$day}' : [". implode(',', $prepared_hours) ."],\n";
}
但结果是:
'0' : [['08:30'],['09:00'],['09:30'],['10:00'],['14:30'],['15:00'],['15:30'],['16:00'],['16:30']],
'1' : [['13:30'],['14:00'],['14:30'],['18:00'],['18:30'],['19:00']
我无法定义时间范围:['08:30', '10:00'], ['..
我真的很感谢任何帮助。
谢谢你。
循环时,跟踪先前迭代的时间并将其与当前迭代的时间进行比较。
当开始一个新组时,销毁之前创建的引用(如果还存在),然后声明一个新引用并将其推入结果数组中。
在处理连续时间时,将当前时间专门推入参考变量的第二个元素。
代码:(演示)
function compactTimes(
array $times,
string $format = 'H:i',
string $separation = "30 minutes"
): array {
$result = [];
$prev = null;
foreach ($times as $time) {
if (!$prev || $time !== date("H:i", strtotime("+$separation $prev"))) {
unset($ref);
$ref = [$time, $time];
$result[] =& $ref;
} else {
$ref[1] = $time;
}
$prev = $time;
}
return $result;
}
var_export(
array_map('compactTimes', $array)
);
也许这可以让你开始:
$start = new \DateTime('9:00');
$end = new \DateTime('14:00');
$period = new \DatePeriod($start,new \DateInterval('PT30M'),$end);
foreach ($period as $date) {
print $date->format('H:i') . '<br>';
}