Find number which is greater than or equal to N in an array

前端 未结 11 1037
长发绾君心
长发绾君心 2020-11-30 05:47

If I have a PHP array:

$array

With values:

45,41,40,39,37,31

And I have a variable:

$numb         


        
相关标签:
11条回答
  • 2020-11-30 06:19

    +1 to Jason.

    My implementation below, but not as brisk

    $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));
    
    0 讨论(0)
  • 2020-11-30 06:22

    EDIT typo on array_search

    Yo... Seems easy enough. Here's a function

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

    to Run echo closest($array, 38);

    0 讨论(0)
  • 2020-11-30 06:26

    You could use array_reduce for this, which makes it more functional programming style:

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

    For the rest, this follows the same principle as the other O(n) solutions.

    0 讨论(0)
  • 2020-11-30 06:27

    Here's a smaller function that will also return the closest value. Helpful if you don't want to sort the array (to preserve keys).

    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;
    }
    
    0 讨论(0)
  • Do a linear scan of each number and update two variables and you'll be done.

    Python code (performance is O(N), I don't think it's possible to beat 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
    

    Please add null checks as appropriate.

    0 讨论(0)
  • 2020-11-30 06:39

    I made a shorter function for that:

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

    Works great in my case: $array = array(128,160,192,224,256,320); $num = 203 :)

    It's taking the nearest number and if there's the same distance between two numbers (like 208 for my example), the next highest number is used.

    0 讨论(0)
提交回复
热议问题