查找给定值之间的数组的两个值

时间:2009-07-28 18:29:38

标签: php arrays

假设我有一个类似于此的数组(实际值可能不会如此可预测):

$ar[0] = 5;
$ar[1] = 10;
$ar[2] = 15;
$ar[3] = 20;

我有$n = 8,找到$n介于$ar[0]$ar[1]之间的好方法是什么?优选地,该解决方案将避免在整个阵列中循环,因为这可能在不同大小的阵列上重复多次。

编辑:
是的,数组将始终排序。

4 个答案:

答案 0 :(得分:5)

对于较小的阵列......

如果您的数组始终在底部以较小的值排序,则可以循环直到达到大于可比较数字的数组。当您到达该点时,记录密钥或到达那里所需的迭代次数。

答案 1 :(得分:1)

如果您不想遍历整个数组,并且您的数组已排序,您可以从中间开始,比较您要查找的值,并根据结果选择上半部分或下半部分继续使用数组。

答案 2 :(得分:1)

这是最简单的任务。

<?php
$minDiff = end($array);
$takeLesser = true;
if ($inputValue > $minDiff) {
  $itemKey = key($array);
} else { 
  foreach ($array as $key => $value) {
    $diff = abs($value - $inputValue);
    if ($minDiff < $diff) {
      break;
    }
    if ($minDiff == $diff && $takeLesser) {
      continue;
    }
    $minDiff = $diff;
    $itemKey = $key;
  }
}  
$result = $array[$itemKey];

答案 3 :(得分:0)

PHP在框架中内置了一个array_search函数,但它本身不使用二进制搜索。 PHP array_search条目的补充:

<?php
    function array_bsearch( $needle, $haystack, $comparator ) {
        $high = Count( $haystack ) -1;
        $low = 0;

        while ( $high >= $low ){
            $probe = Floor( ( $high + $low ) / 2 );
            $comparison = $comparator( $haystack[$probe], $needle );
            if ( $comparison < 0 ) {
                $low = $probe +1;
            } elseif ( $comparison > 0 ) {
                $high = $probe -1;
            } else {
                return $probe;
            }
        }

      // ---The loop ended without a match
      return -1;
    }
?>