2013-04-10 31 views
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; 
} 

我已經找到了解決方案,用於陣列得到最接近的值,但在目前的$ 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; 
} 

請注意,如果目前的$ 40 ==下面這事很遠,因爲壟斷都指向一個方向,1比接近40 39.

UPDATE:

我已經找到了解決辦法,感謝大家

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

所以在這個例子中,你是調用帶有$搜索= 40「最近的」功能$ ARR =(6,16,26,36),你希望它返回6 ? – imran 2013-04-10 04:40:21

+0

這是一個動態數組,但是在這個例子中,我想返回6.如果我有$ search = 35,那麼接下來是36.如果$ search = 37,接下來是6 – 2013-04-10 05:15:11

回答

0

下面是增加了一個「距離」字段(前方的距離的平方是從$電流)查詢 - 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 
+0

我會嘗試一下,謝謝你的建議! – 2013-04-10 05:15:39

+0

它引發sql錯誤: 您的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'AS距離'卡附近使用正確的語法。WHERE Category ='street'AND Location <> 40'at line 4 – 2013-04-10 05:21:59

+0

糟糕我忘記了END CASE: -/Fixed。 – James 2013-04-10 05:23:37