
在处理包含大量时间戳的数据时,一个常见的需求是识别出一天中最早和最晚的“时钟时间”所对应的原始完整时间戳。例如,我们可能有一个包含数千个不同日期和时间的时间戳数组,需要找出其中时间部分(如“00:00:01 am”或“11:59:59 pm”)最早和最晚的那些记录,并保留其原始的日期信息。
一个直观但存在问题的尝试是先将所有时间戳转换为仅包含时钟时间的部分,然后找出最小值和最大值,例如:
$timestamps = array();
for ($i = 0; $i < 5000; $i++) {
$timestamps[] = mt_rand(strtotime('1900-01-01 00:00:00 am'), strtotime('2100-12-31 11:59:59 pm'));
}
function callback($timestamp) {
return strtotime(date('h:i:s a', $timestamp));
}
// 这种方法会返回最早和最晚的时钟时间,但日期会被重置为当前日期
echo date('Y-m-d h:i:s a', min(array_map('callback', $timestamps)));
echo "\n";
echo date('Y-m-d h:i:s a', max(array_map('callback', $timestamps)));上述方法虽然能找到最早和最晚的时钟时间,但由于 strtotime(date('h:i:s a', $timestamp)) 默认会将日期部分设置为当前日期,导致我们无法获取到原始的时间戳信息。我们需要一种方法,在比较时只考虑时钟时间,但在返回结果时保留原始的完整时间戳。
为了解决上述问题,我们可以利用 PHP 的 array_reduce 函数。array_reduce 能够迭代数组中的每个元素,并使用回调函数将它们归结为一个单一的结果。这使得它非常适合在一次遍历中同时找出最早和最晚的时钟时间对应的原始时间戳。
以下是实现此功能的代码示例:
<?php
// 模拟生成一个包含大量随机时间戳的数组
$timestamps = array();
for ($i = 0; $i < 5000; $i++) {
$timestamps[] = mt_rand(strtotime('1900-01-01 00:00:00 am'), strtotime('2100-12-31 11:59:59 pm'));
}
/**
* 从时间戳数组中找出最早和最晚时钟时间对应的原始时间戳。
*
* @param array $timestamps 包含Unix时间戳的数组。
* @return array 包含 'min' 和 'max' 键的数组,每个键对应一个数组,
* 其中包含 [0] 时钟时间字符串 (HH:ii:ss) 和 [1] 格式化的原始完整时间戳。
*/
$res = array_reduce(
$timestamps, // 要遍历的时间戳数组
function($carry, $currentTimestamp) {
// 1. 从当前时间戳中提取时钟时间字符串 (24小时制,方便比较)
$currentTimeString = date('H:i:s', $currentTimestamp);
// 2. 格式化原始完整时间戳,用于最终结果输出
$formattedOriginalTimestamp = date('Y-m-d h:i:s a', $currentTimestamp);
// 3. 检查并更新最早时钟时间
// 如果 $carry['min'][0] 为 null (初始状态) 或当前时间字符串更早
if (is_null($carry['min'][0]) || $currentTimeString < $carry['min'][0]) {
$carry['min'] = [$currentTimeString, $formattedOriginalTimestamp];
}
// 4. 检查并更新最晚时钟时间
// 如果 $carry['max'][0] 为 null (初始状态) 或当前时间字符串更晚
if (is_null($carry['max'][0]) || $currentTimeString > $carry['max'][0]) {
$carry['max'] = [$currentTimeString, $formattedOriginalTimestamp];
}
// 5. 返回更新后的累加器
return $carry;
},
// 初始累加器值:将 'min' 和 'max' 都初始化为包含两个 null 的数组
// [0] 用于存储时钟时间字符串进行比较,[1] 用于存储对应的原始格式化时间戳
['min' => [null, null], 'max' => [null, null]]
);
// 输出结果
print_r($res);
?>array_reduce($timestamps, function($carry, $currentTimestamp) { ... }, ['min' =youjiankuohaophpcn [null, null], 'max' => [null, null]]):
$currentTimeString = date('H:i:s', $currentTimestamp);:
$formattedOriginalTimestamp = date('Y-m-d h:i:s a', $currentTimestamp);:
比较逻辑 (if (is_null($carry['min'][0]) || $currentTimeString < $carry['min'][0])):
return $carry;:
运行上述代码,你将得到类似以下的结果(具体日期和时间取决于随机生成的时间戳):
Array
(
[min] => Array
(
[0] => 00:00:30
[1] => 1997-05-03 12:00:30 am
)
[max] => Array
(
[0] => 23:59:36
[1] => 1983-07-21 11:59:36 pm
)
)结果清晰地展示了最早的时钟时间(00:00:30)及其对应的原始完整时间戳 (1997-05-03 12:00:30 am),以及最晚的时钟时间(23:59:36)及其对应的原始完整时间戳 (1983-07-21 11:59:36 pm)。
通过这种 array_reduce 的方法,我们不仅能够精确地找出最早和最晚的时钟时间,还能保留它们原始的日期信息,完美解决了在不丢失上下文的情况下进行时间比较的需求。
以上就是如何从时间戳数组中获取最早和最晚时钟时间的原始时间戳的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号