0

我正在进行一场垄断游戏,我需要从给定值中检索最近的位置。我得到这样的最近位置:

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,则低于它的任何东西都相距甚远,因为 Monopoly 朝一个方向发展,因此 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;
}
4

1 回答 1

0

Here's a query that adds a "distance" field (the distance ahead the square is from $current) - mysql syntax for the CASE statement

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
于 2013-04-10T04:41:24.140 回答