找到针在大海捞针中添加一针直到找到针

时间:2018-06-08 19:36:28

标签: php math

我有一个由数据库中的表创建的随机数数组

$numbersArr = array(3,5,17,19,24,30,38,...)
$userInput = 35;

到目前为止,这就是我所拥有的

if (in_array($userInput, $numbersArr)){

 echo 'found needle';

}else{

//add one to the $userInput until find a needle

}

所以程序会增加1到35,直到找到38,然后停止。我怎样才能做到这一点?我很确定它很简单,但我无法绕过它。

5 个答案:

答案 0 :(得分:2)

无需循环。
您可以过滤数组,并回显最小数。

$numbersArr = array(3,5,17,19,24,30,38,12,15,21,67);
$userInput = 35;

// Filter array, return values larger than user input
$filtered = array_filter($numbersArr,
    function ($value) use($userInput) {
        return $value >= $userInput;
    }
);
If(count($filtered)>0){
    // Echo smallest number in array
    Echo min($filtered);
}else{
    Echo "no number larger than user input";
}

在此处试试:https://3v4l.org/fMg7K

答案 1 :(得分:1)

您可以使用简单的for循环:

$numbersArr = array(3,5,17,19,24,48,74,30,38);
sort($numbersArr);
$lastNumbr = end($numbersArr);
$userInput = 35.5;

if ($userInput <= $lastNumbr) {
    for ($i = ceil($userInput); $i <= $lastNumbr; $i+=1) {
        if (in_array($i, $numbersArr)) {
            echo 'found needle: '. $i;
            break;
        }
    }
} else {
    echo "input number out of range, must be below " . $lastNumbr;
}

这将获取$userInput值并向其添加1,直到它到达$numbersArr中的针。这也将通过舍入它们来处理浮点数。超出数组中高位数的数字会返回“超出范围”的消息。

答案 2 :(得分:0)

这会做你所要求的,但我想知道你的目标究竟是什么,因为看起来这样做似乎并没有用。

def unicode_to_string(_in_unicode):
return unicodedata.normalize('NFKD', _in_unicode).encode('ascii', 'ignore')

答案 3 :(得分:0)

<?php

$numbers = array(3,5,17,19,24,30,38,41,47);
$guess   = 35;

$limit = max($numbers);
while($guess <= $limit && !in_array($guess, $numbers))
    $guess++;

var_dump($guess);

输出:

int(38)

答案 4 :(得分:0)

SergGr实际上是正确的,只需循环数组并将项目与用户输入进行比较就更快。

这是我找到最快的方法。

$match = false;
Foreach($numbersArr as $item){
    If($item >= $userInput)
        If($item < $match || $match == false)
            $match = $item;
}
Echo "\n\n" . $match;

在此处查看结果:https://3v4l.org/v9og4