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