PHP:如何检查数组中哪个项最接近给定数字?

时间:2015-05-11 18:59:23

标签: php

我需要检查数组array( 300, 600, 900, 1200 )中哪个项最接近我在变量$number中存储的数字。

我已经通过PHP manual查看了一个可以为我做这个的方法或功能但是我的研究没有找到任何结果。希望有人能提出建议。

4 个答案:

答案 0 :(得分:1)

如果数组中的数字总是按升序排序,您可以在查看距离时循环,当您开始远离数字时,返回最后一个数字。像这样:

<?php
$number = mt_rand(1, 1200);
$array = array(300, 600, 900, 1200);

function closest($number, $array){
    //infinite distance to start
    $dist = INF;
    //remember our last value
    $last = false;

    foreach($array as $v){
        //get our current distance
        $dist2 = abs($number - $v);

        //check if we are getting further than last number was
        if($dist2 > $dist){
            //return our last value
            return $last;
        }
        //set our new distance
        $dist = $dist2;
        //set our last value for next iteration
        $last = $v;
    }
    return $last;
}

echo "<pre>";
var_dump($number);
var_dump(closest($number, $array));

将输出:

Input: int(522)
Output: int(600)

演示:http://codepad.viper-7.com/NjcdP0

如果未对值进行排序,则需要循环每个值以获得距离,然后找到最小距离。类似的东西:

<?php
$number = mt_rand(1, 1200);
$array = array(300, 600, 900, 1200);

function closest($number, $array){
    //find distances to number
    $dist = array_map(
        function($val) use ($number) {
            return abs($number - $val);
        },
        $array);
    //flip array so distance is key
    $dist = array_flip($dist);
    //sort distance by key
    ksort($dist);

    //get key for shortest distance
    $key = array_values($dist)[0];

    return $array[$key];
}

echo "<pre>";
echo "Input: ";
var_dump($number);
echo "Output: ";
var_dump(closest($number, $array));

输出:

Input: int(677)
Output: int(600)

演示:http://codepad.viper-7.com/N5nv0v

答案 1 :(得分:1)

我确定这不是最快的方式,但可以使用usort编写。在按目标编号的绝对差值对数组进行排序后,最接近的值将是第一个:

usort($your_array, function($a, $b) use ($number) {
    if ($a == $b) { return 0; }
    return abs($number - $a) > abs($number - $b) ? 1 : -1;
});

$closest = reset($your_array);

在PHP 7中,可以使用组合比较运算符简化usort回调。

usort($your_array, function($a, $b) use ($number) {
    return abs($number - $a) <=> abs($number - $b);
});

答案 2 :(得分:0)

您必须迭代并存储当前结果和差异,如下所示:

function closest_number(array $array, $number) {
    $result     = null;
    $difference = null;

    foreach ($array as $element) {    
        if ($difference === null || abs($element - $number) < $difference) {
            $difference = abs($element - $number);
            $result     = $element;
        }
    }

    return $result;
}

答案 3 :(得分:0)

这里有一些神奇的代码:

$arr = [300, 600, 900, 1200];
$number = 920;
$deltas = array_reduce(
    $arr, 
    function($t, $v) use ($number) { 
        $t[$v] = abs($v - $number); 
        return $t; 
    },
    []
);
asort($deltas);
echo array_keys($deltas)[0];