我有一个id和unix时间的数组
$array = Array(
[12] => 14235183200,
[8] => 1443045600,
[1] => 1417388400
);
以及当前时间CCD_ 1。我需要检查其中哪一个最接近当前时间,然后获取最接近该值的数组键。如果时间已经过去,那么这个值当然不应该计算在内(只有未来的日期才重要)。
min()
应该给我比较值中的最低值。但如果我输入当前日期,则任何未来日期都会更大,因此我得到当前日期。array_search()
会给我我需要的钥匙。所以我需要这个:
$key = array_search($array, $min_date);
其中CCD_ 4是最接近阵列中的当前日期的日期。但是如何预成型支票呢?我尝试过foreach($array as $value)
,但当我尝试时
foreach($array as $value){
}
任何测试都会失败,因为$value是所有值的组合字符串。
我们有两个基本规则;
- 任何低于时间(
$curr_time
)的都被排除在外 - 选择最接近时间的一个(
$curr_time
)
这意味着我们可以做两个不同的逻辑,得到我们的答案;
- 从最小到最大对数组进行排序(排序为
ASC
) - 如果时间小于
$curr_time
,则将其排除- 第一个不小于
$curr_time = time();
0的是我们最接近的
- 第一个不小于
natsort($array); //Sort from lowest-highest
foreach($array as $k => $time) { //Loop through our array of times
if( $time < $time_to_look_for ) {
continue; //It's less than the time we need, so exclude it
} else {
//First entry that isn't less than the time we need
echo $k;
break;
}
}
https://eval.in/301601
手动链接
- natsort
- 继续
如果您要查找的值在数组中,那么array_search函数是最好的。因为您正在寻找最接近的值,而该值可能不在数组中,所以array_search将不起作用。然而,这是相当简单的程序。你需要遍历每个值,所以你需要foreach,这是正确的。您需要维护您找到的最佳值的密钥,因此您需要一个变量,我将其称为$key。"最接近"的概念有不止一个定义。我将把它定义为来自abs的最小结果($cur_time-$value)。从那里开始,您的代码实际上就是为您编写的:
注意:我更改了这个代码,因为它被要求忽略过去的时间。我用continue语句完成了这项工作,主要是为了让这个例子现在展示如何在foreach循环中使用continue和break。
$key = null; // I initialize it this way. You can do it a different way.
foreach($array as $k=>$v)
{
if($v<$cur_time) continue;
if($key == null) $key = $k; // The first item is closest by default.
elseif($v-$cur_time < $array[$key]-$cur_time)
$key = $k;
if($array[$key] == $cur_time) break;
}
当这结束时,$key将具有与$cur_time值最接近的键。
我根据下面的评论添加了一个休息时间。如果您找到了该值,则没有必要继续搜索。