PHP从针下降搜索数组

时间:2014-03-29 05:35:54

标签: php arrays search

我正在尝试编写一类类似于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次迭代的代码。

2 个答案:

答案 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 ;
}