数组中最接近的数字,但在大富翁表中


Closest number in array, but on Monopoly table

我有一个正在进行的大富翁游戏,我需要从给定值中检索最近的位置。我得到最近的位置,像这样:

function Field_GetNearestByCategory($current,$category) {
    $current = (int)$current;
    $category = SQLEscape($category);
    $s = "SELECT ID,Location FROM `card` WHERE Category='$category' AND Location <> $current";
    $qr = SQLQuery($s);
    $locs = array();
    while($r = SQLGetArray($qr)) {
        $locs[] = $r[1];
    }
    return $locs;
}

我已经找到了在数组中获得最接近值的解决方案,但问题发生在$current == 40和下一个最接近的字段应该是6(让我们说我们想去最近的铁路)。

function closest($search, $arr)
{
    $closest = null;
    foreach($arr as $item)
    {
        if($closest == null || abs($search - $closest) > abs($item - $search))
        {
            $closest = $item;
        }
    }
    return $closest;
}

请注意,如果$current == 40,任何低于它的东西都是很远的,因为大富翁是单向的,所以1比39更接近40。

更新:

我找到解决办法了,谢谢大家

function closest($search, $arr) {
    $c = null;
    sort($arr);
    foreach($arr as $k) {
        if($k > $search) { return $k; }
        else {
            if(!$c) $c = $k;
        }
    }
    return $c;
}

这是一个添加了"distance"字段的查询(正方形前面的距离是从$current开始的)- mysql的CASE语句语法

SELECT ID, Location, 
CASE WHEN Location < $current THEN Location + 40 - $current 
    ELSE Location - $current
END
AS Distance 
FROM `card` WHERE Category='$category' AND Location <> $current