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

Php 查找数组中大于或等于N的数字,php,arrays,arraylist,Php,Arrays,Arraylist,如果我有一个PHP数组: $array 价值观: 45,41,40,39,37,31 我有一个变量: $number = 38; 如何返回值?: 39 因为这是数组中最接近38(向上计数)的值 问候, 泰勒以下是获得所需结果并处理任何阵列数据的高级过程: 筛选保留大于或等于目标值的数组,然后选择剩余的最小值。这是“最佳”值(如果所有值都小于此值,则可能为“无”)——这是O(n) 或者,首先对数据进行排序并查看下面的内容——这是O(n lg n)(希望如此) 现在,假设数组按升序排序,

如果我有一个PHP数组:

$array
价值观:

45,41,40,39,37,31
我有一个变量:

$number = 38;
如何返回值?:

39

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

问候,

泰勒


以下是获得所需结果并处理任何阵列数据的高级过程:

  • 筛选保留大于或等于目标值的数组,然后选择剩余的最小值。这是“最佳”值(如果所有值都小于此值,则可能为“无”)——这是
    O(n)
  • 或者,首先对数据进行排序并查看下面的内容——这是
    O(n lg n)
    (希望如此)
现在,假设数组按升序排序,此方法将起作用:

  • 循环遍历数组并找到大于或等于目标的第一个元素——这是
    O(n)
如果数组正在下降(如文章中所述),请执行上述操作,但是:

  • 向后迭代——这是
    O(n)
  • 首先按升序排序(参见fardjad的答案)——这是
    O(n lg n)
    (希望如此)
  • 向前迭代,但保留一个look-behind值(如果精确值被跳过,则记住“下一个最高值”)——这是
    O(n)

快乐编码。

编辑数组搜索中的键入

哟。。。看起来很容易。这里有一个函数

<?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;
}

对每个数字进行线性扫描,然后更新两个变量,就可以完成了

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

def closestNum(numArray,findNum):
diff=无穷大#替换为实际无穷大值
closestNum=无穷大#可以设置为任何值
对于Numaray中的num:
如果((num-findNum)>0且(num-findNum)

请根据需要添加空检查。

如果您真的想要距离“最近”的值,即使它是较小的值,也可以尝试此项,因为@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];
    }
}
}
函数最接近的_值($value,$array){
if(数组搜索($value,$array)){
返回$value;
}否则{
$array[]=$value;
排序($数组);
$key=array\u search($value$array);
如果($key==0){返回$array[$key+1];}
如果($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这里有一个较小的函数,它也将返回最接近的值。如果您不想对数组排序(以保留键),这将非常有用

这是我的解决办法

$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;
$array=array(10,56,78,17,30);
$num=65;
$diff=$num;
$min=$num;
foreach($a数组){
if(绝对值($a-$num)<$diff){
$diff=abs($a-$num);
$min=$a;
}
}
echo$min;

试试这个简单的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));
?>

我为此制作了一个较短的函数:

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(128160192224256320);$num=203
:)

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

+1 to Jason

我的实现如下,但没有那么轻快

$array = array(1,2,4,5,7,8,9);

function closest($array, $number) {
    $array = array_flip($array);

    if(array_key_exists($number, $array)) return $number;

    $array[$number] = true;

    sort($array);

    $rendered = array_slice($array, $number, 2, true); 

    $rendered = array_keys($rendered);

    if(array_key_exists(1, $rendered)) return $rendered[1]; 

    return false;
}

print_r(closest($array, 3));

为此,您可以使用
array\u reduce
,这使其更具功能性编程风格:

函数最近($needle,$haystack){
返回数组减少($haystack,function($a,$b)use($needle){
返回abs($PINEER-$a)

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

没有冒犯的意思,但这是一个家庭作业问题吗?你的描述与你的问题标题不一致。要么你在寻找数字是否存在以及在哪个索引,要么你在寻找最接近的数字。这是非常不同的。是的,我意识到我的标题不一致。lol不,这不是家庭作业,原因是我需要找到这个值是因为我有从数据库中的值动态创建的对象,这些值具有一个自定义属性“数据排序”,我尝试做的是按顺序放置新对象(根据属性的值)通过使用ajax将所有对象的“数据排序”值数组从索引页面发送到PHP页面,并使用jquery。在函数将其附加到正确位置之后,我不确定我是否完全理解了目标,但这似乎是一种相当脆弱的方法。我只是将所有对象填充到数组中,然后对数组进行排序y、 无论是服务器端还是客户端…如果数字是上面的两个数字,可能会重复?3?这不是正确的概括。它已被排序。数字不可能是搜索上方的两个数字,我的朋友。这将使其无效,因为它是数字最接近的数字。如果数字是31,则此操作是否有效上面的数字是37?啊,很聪明。事实上,仅仅为了使用该逻辑,+1。但是,
array\u search(…)
如果输入中根本不存在该数字,则仍然存在问题,否?“因为这是数组中最接近38(累计)的值?”->对我来说,这意味着他在寻找两个数字之间的数字距离,以及当前数字上方的数字。因此,下面的任何数字都无效。按照这种逻辑,我可以删除它下方的所有数字…这不是其他人读它的方式吗?如果不够公平,你能帮我理解它吗
复制/粘贴
密码,我放弃后就不起作用了
<?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));
?>
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(1,2,4,5,7,8,9);

function closest($array, $number) {
    $array = array_flip($array);

    if(array_key_exists($number, $array)) return $number;

    $array[$number] = true;

    sort($array);

    $rendered = array_slice($array, $number, 2, true); 

    $rendered = array_keys($rendered);

    if(array_key_exists(1, $rendered)) return $rendered[1]; 

    return false;
}

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