我正在尝试编写一类类似于this question的最近数字代码块,除了我不希望我的代码返回任何大于针的值。
基本上你有一系列值:
$array = array(2012, 2013, 2015, 2016, 2018);
该功能将具有这些结果
needle: 2011 result: 2012
needle: 2012 result: 2012
needle: 2014 result: 2013
我正在思考这些问题:
while(!in_array($year, $years))
{
if($year<$years[count($years)+1]){$year = $years[$count($years)+1];}//Edited
$year -= 1;
}
除了没有捕获2011年的例外情况,因为它少于数组中的所有值
编辑,我想出了如何捕获2011年的例外,现在我唯一的问题是,如果说3012年被输入,那么这似乎是效率低下的PHP将会运行〜1000次迭代的代码。
答案 0 :(得分:1)
对于大型阵列,您的代码示例可能会变得非常昂贵。最好避免多次循环遍历数组,这就是in_array()在幕后必须做的事情。
试试这个:
function nearest(array $arr, $needle) {
$closest = current($arr);
foreach ($arr as $val) {
if ($val === $needle) {
return $val; // found it :)
}
if ($val > $closest && $val < $needle) {
// we found something closer and less than the needle, so use it
$closest = $val;
}
}
// we've reached the end, so return the closest solution
return $closest;
}
答案 1 :(得分:0)
我为你创造了一个功能。尝试使用它。
function get_nearest($array, $needle){
$answer = FALSE ;
$diff = FALSE ;
foreach($array as $arr){
$temp_diff = abs($arr-$needle) ;
if($diff === FALSE || $temp_diff < $diff){
$answer = $arr ;
$diff = $temp_diff ;
}
}
return $answer ;
}