
在处理包含多个营业时间段的数组时,常见需求是将所有时间段连接起来显示,例如:“今日营业时间:9:00-9:45, 9:55-10:20, 10:30-11:00”。这通常通过遍历数组并使用 join 函数实现。原始代码片段展示了这种处理方式:
$ranges = [
['from' => '9:00', 'to' => '9:45'],
['from' => '9:55', 'to' => '10:20'],
['from' => '10:30', 'to' => '11:00'],
];
// 原始处理方式:格式化并连接所有时间段
$formatted_ranges = array_map(function($range) {
// 假设存在一个 format_time 方法将时间格式化为 H:i
return $this->format_time($range['from']) . ' - ' . $this->format_time($range['to']);
}, $ranges);
// 输出:Open hours today: 9:00 - 9:45, 9:55 - 10:20, 10:30 - 11:00
return sprintf(
__('Open hours today:', 'example') . ' <span>%s</span>',
join(', ', $formatted_ranges)
);然而,实际需求可能并非如此。有时,我们只需要展示整体的营业时间范围,即从最早的开始时间到最晚的结束时间,忽略中间的间断。例如,对于上述时间段,我们期望的输出是:“今日营业时间:9:00 - 11:00”。
尝试使用 array_key_first($formatted_ranges) 只能获取第一个格式化后的时间段(例如 "9:00 - 9:45"),这不符合获取整体范围的要求。核心挑战在于,如何在不遍历所有时间段并连接它们的情况下,高效地提取出这个整体的起始和结束时间。
解决这个问题的关键在于,理解“整体营业时间范围”的定义。它由第一个营业时段的开始时间,以及最后一个营业时段的结束时间共同决定。因此,我们无需处理或格式化数组中的所有中间时间段,只需直接访问原始 $ranges 数组的第一个元素的 from 值和最后一个元素的 to 值即可。
这种方法具有以下优点:
立即学习“PHP免费学习笔记(深入)”;
以下是实现上述解决方案的PHP代码示例:
<?php
// 示例时间段数据
$ranges = [
['from' => '9:00', 'to' => '9:45'],
['from' => '9:55', 'to' => '10:20'],
['from' => '10:30', 'to' => '11:00'],
];
/**
* 提取并格式化整体营业时间范围
*
* @param array $ranges 包含时间段的数组,每个元素如 ['from' => 'H:i', 'to' => 'H:i']
* @return string 格式化的营业时间字符串,或错误信息
* @throws Exception 当数据不足时抛出异常
*/
function getOverallBusinessHours(array $ranges): string
{
// 1. 数据有效性检查
// 确保数组不为空,并且第一个元素包含 'from' 和 'to' 键
if (empty($ranges) || !isset($ranges[0]['from'], $ranges[0]['to'])) {
throw new Exception('业务时间数据不足或格式不正确。');
}
// 2. 获取最早的开始时间
// 直接访问数组的第一个元素(索引为0)的 'from' 键
$firstStartTime = $ranges[0]['from'];
// 3. 获取最晚的结束时间
// 使用 array_key_last() 获取数组最后一个元素的键,然后访问其 'to' 键
// array_key_last() 在 PHP 7.3+ 版本可用
$lastEndTime = $ranges[array_key_last($ranges)]['to'];
// 4. 格式化并输出结果
// 使用 printf 函数将获取到的起始和结束时间组合成期望的字符串
return sprintf('Open hours today: %s - %s', $firstStartTime, $lastEndTime);
}
try {
echo getOverallBusinessHours($ranges);
// 预期输出: Open hours today: 9:00 - 11:00
} catch (Exception $e) {
echo '错误: ' . $e->getMessage();
}
echo "\n";
// 示例:空数组或无效数据
$emptyRanges = [];
try {
echo getOverallBusinessHours($emptyRanges);
} catch (Exception $e) {
echo '错误: ' . $e->getMessage() . "\n"; // 预期输出: 错误: 业务时间数据不足或格式不正确。
}
$invalidRanges = [
['start' => '9:00', 'end' => '10:00'] // 键名不匹配 'from'/'to'
];
try {
echo getOverallBusinessHours($invalidRanges);
} catch (Exception $e) {
echo '错误: ' . $e->getMessage() . "\n"; // 预期输出: 错误: 业务时间数据不足或格式不正确。
}
?>代码解析:
// PHP 7.2 及更早版本获取最后一个元素的键 end($ranges); // 将数组内部指针移到最后一个元素 $lastKey = key($ranges); // 获取当前指针位置的键 reset($ranges); // 可选:将数组内部指针重置回第一个元素 $lastEndTime = $ranges[$lastKey]['to'];
当需要从一组离散的时间段中提取并展示整体的营业时间范围时,直接访问数组的首个元素的起始时间和最后一个元素的结束时间是一种极为高效且简洁的方法。它避免了不必要的循环和字符串连接操作,显著提升了代码的性能和可读性。通过结合适当的数据验证和PHP版本兼容性考量,您可以构建出既健壮又高效的时间范围处理逻辑。
以上就是PHP数组时间范围优化:高效提取整体首尾营业时间的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号