2014-03-29 49 views
0

我正在尝试编写一种类似于this question的最近数量的代码块,除了我不想让我的代码返回比针更大的值。PHP从针下降搜索阵列

基本上你有值的数组:

$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年的例外,并不比所有的VA都好在阵列

编辑,我想出了如何捕捉2011年的例外,现在我唯一的问题是,这只是似乎效率低下,如果说3012年将被输入PHP将通过〜1000迭代的运行码。

+1

鉴于针'2011',最低值是'2012',你断定,它不应该比针返回一个值时,为什么它返回'2012' ?它不应该返回'null'或'-1'什么的? – Dan

+0

我想它应该,但我想那里总是要返回的数字,如果针少于最小数组的值,则不会有实际的响应。基本上在我的应用程序中,返回的值进入MySQLi查询,我想尽可能少地出错。 – Blakethepatton

回答

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

这似乎是个窍门。我完全同意使用while循环代码可能会非常昂贵。感谢您告诉我关于in_array()会在幕后做些什么,我想我没有真正想到php如何为in_array()生成结果。 :) – Blakethepatton

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 ; 
} 
+0

这个答案的问题是我需要代码返回一些值而不是布尔值。 – Blakethepatton

+0

它实际上并不返回一个布尔值,但至少有一个数组的值 – YouSer

+0

啊我想是的。 – Blakethepatton