在数组中查找大于或等于N的数字

时间:2011-05-27 02:51:03

标签: php arrays arraylist

如果我有一个PHP数组:

$array

使用值:

45,41,40,39,37,31

我有一个变量:

$number = 38;

如何返回值?:

39

因为这是数组中最接近38(向上计数)的值吗?

此致

泰勒

11 个答案:

答案 0 :(得分:24)

<?php
function closest($array, $number) {

    sort($array);
    foreach ($array as $a) {
        if ($a >= $number) return $a;
    }
    return end($array); // or return NULL;
}
?>

答案 1 :(得分:10)

这是一个获得所需结果并适用于任何数组数据的高级过程:

  • 过滤数组,保持大于或等于目标值,然后选择最低剩余值。这是“最佳”值(如果所有值都较小,则可能“无”) - 这是O(n)
  • 或者,首先对数据进行排序,然后参见下文 - 这是O(n lg n)(希望如此)

现在,假设数组按ASCENDING排序,这种方法可行:

  • 遍历数组并找到大于或等于目标的第一个元素 - 这是O(n)

如果数组是DESCENDING(如在帖子中),请执行上述操作,但是:

  • 向后迭代 - 这是O(n)
  • 首先将其排序(请参阅fardjad的回答) - 这是O(n lg n)(希望如此)
  • 迭代前锋,但保留一个后视值(如果确切被跳过则记住“下一个最高”) - 这是O(n)

快乐的编码。

答案 2 :(得分:7)

编辑对array_search

的拼写错误 哟......好像很容易。这是一个功能

<?php 
$array = array(45,41,40,39,37,31);

   function closest($array, $number){
    #does the array already contain the number?
    if($i = array_search( $number, $array)) return $i;

    #add the number to the array
    $array[] = $number;

    #sort and refind the number
    sort($array);
    $i = array_search($number, $array);

    #check if there is a number above it
    if($i && isset($array[$i+1])) return $array[$i+1];

    //alternatively you could return the number itself here, or below it depending on your requirements
    return null;
}

运行echo closest($array, 38);

答案 3 :(得分:4)

这是一个较小的函数,它也会返回最接近的值。如果您不想对数组进行排序(以保留键),则会很有帮助。

function closest($array, $number) {
    //does an exact match exist?
    if ($i=array_search($number, $array)) return $i;

    //find closest
    foreach ($array as $match) {
        $diff = abs($number-$match); //get absolute value of difference
        if (!isset($closeness) || (isset($closeness) && $closeness>$diff)) {
            $closeness = $diff;
            $closest = $match;
        }
    }
    return $closest;
}

答案 4 :(得分:2)

对每个数字进行线性扫描并更新两个变量,您就完成了。

Python代码(性能为O(N),我认为不可能击败O(N)):

def closestNum(numArray, findNum):
    diff = infinity       # replace with actual infinity value
    closestNum = infinity # can be set to any value
    for num in numArray:
        if((num - findNum) > 0 and (num - findNum) < diff):
            diff = num - findNum
            closestNum = num
    return closestNum

请根据需要添加空检查。

答案 5 :(得分:1)

如果你真的想要距离“最接近”的值,即使它的价值较小,试试这个,@ Jason得到的大部分功劳。

想象一下,如果您想在下面找到最接近的数字38.9,那么

$array = array(37.5, 38.5, 39.5);

这里的大多数解决方案都会给你39.5,而38.5更接近。 如果你正在寻找的是数组中两个数字之间的确切中间位置,那么这个解决方案只会取下一个最高值:

function nearest_value($value, $array) {
if (array_search($value, $array)) {
    return $value;
} else {
    $array[] = $value;
    sort($array);
    $key = array_search($value, $array);
    if ($key == 0) { return $array[$key+1]; }
    if ($key == sizeof($array)-1) { return $array[$key-1]; }
    $dist_to_ceil = $array[$key+1]-$value;
    $dist_to_floor = $value-$array[$key-1];
    if ($dist_to_ceil <= $dist_to_floor) {
        return $array[$key+1];
    } else {
        return $array[$key-1];
    }
}
}

它缺乏优雅,它弥补了准确性。再次,非常感谢@Jason。

答案 6 :(得分:0)

试试这个简单的PHP函数:

<?php
function nearest($number, $numbers) {
    $output = FALSE;
    $number = intval($number);
    if (is_array($numbers) && count($numbers) >= 1) {
        $NDat = array();
        foreach ($numbers as $n)
            $NDat[abs($number - $n)] = $n;
        ksort($NDat);
        $NDat   = array_values($NDat);
        $output = $NDat[0];
    }
    return $output;
}

echo nearest(90, array(0, 50, 89, 150, 200, 250));
?>

答案 7 :(得分:0)

我为此做了一个更短的功能:

function nearestNumber($num, $array) {
    if(!in_array($num, $array)) $array[] = $num;
    sort($array);
    $idx = array_search($num, $array);
    if(($array[$idx] -$array[$idx-1]) >= ($array[$idx+1] -$array[$idx])) return $array[$idx+1];
    else return $array[$idx-1];
}

在我的案例中效果很好:$array = array(128,160,192,224,256,320); $num = 203:)

它取最接近的数字,如果两个数字之间的距离相同(例如208),则使用下一个最高数字。

答案 8 :(得分:0)

+1杰森。

我的实施如下,但不是很活跃

printf("Number of tracks: ");
fflush( stdin );
scanf("%d", &track);

printf("Is this an album or single: ");
fflush( stdin );
scanf("%c", &type);

答案 9 :(得分:0)

您可以使用array_reduce来实现此功能,这样可以实现更多函数式编程样式:

function closest($needle, $haystack) {
    return array_reduce($haystack, function($a, $b) use ($needle) {
        return abs($needle-$a) < abs($needle-$b) ? $a : $b;
    });
}

对于其余的,这遵循与其他 O(n)解决方案相同的原则。

答案 10 :(得分:-1)

这是我的解决方案。

$array=array(10,56,78,17,30);
$num=65;
$diff=$num;
$min=$num;

foreach($array as $a){
          if( abs($a-$num)< $diff ){
              $diff=abs($a-$num);
              $min=$a;
          }
}

echo $min;