2015-09-16 36 views
1

這裏對PHP很新穎,但無法找到相關信息來幫助我解決這個問題。函數使用array_multisort但不知道如何指定密鑰

基本上我正在寫一個函數來在一天內從我的mysql數據庫中獲取馬的比賽時間,並對它們進行排序。所以我拉入3個值 - racedate,racevenue和sections。部分是我可以指定我是否想要他們最後的200米時間,他們最後的400米時間等等。

我運行查詢,然後把結果放到一個數組中。然後我想用$ sections的值對數組進行排序。

我的問題是創建數組$ time來使用array_multisort。我可以使它工作的唯一方法是對'time200'進行硬編碼以指定要分類的內容。我真的希望能夠通過$ section變量進行排序,所以我可以在$ sections傳入的任何類型的列名稱(即time200,time400,time600等)上使用此函數。

把$ sections而不是time200不起作用(這對你知道更多你正在做什麼的人來說是顯而易見的),但我不明白爲什麼。

感謝您的幫助!

function sectionalrank($racedate, $racevenue, $sectional) { 
    global $connection; 

    $query = "SELECT horsename, $sectional "; 
    $query .= "FROM runs "; 
    $query .= "WHERE racedate = '$racedate' "; 
    $query .= "AND venue = '$racevenue' "; 
    $query .= "AND $sectional > 0"; 

    $result = mysqli_query($connection, $query); 

    $array = array(); 
    while($row = mysqli_fetch_assoc($result)) { 
     $array[] = $row; 
    } 

    $times = array(); 
    foreach ($array as $a) { 
     $times[] = $a['time200']; 
    } 

    array_multisort($times, SORT_ASC, $array); 

    return $array; 

    } 
+0

最好直接從查詢中用ORDER BY子句對結果進行排序。你也應該爲你查詢參數使用準備好的語句。這個代碼是廣泛開放的SQL注入。 – Orangepill

+0

啊當然!非常感謝 –

回答

0

您的方法似乎很好。這個對我有用。

function sectionalrank($racedate, $racevenue, $sectional) 
    { 
    // simulate database query 
    $racedata[] = array('horsename' => 67, 'time200' => 2, 'time400' => 8); 
    $racedata[] = array('horsename' => 86, 'time200' => 1, 'time400' => 3); 
    $racedata[] = array('horsename' => 85, 'time200' => 6, 'time400' => 9); 
    $racedata[] = array('horsename' => 98, 'time200' => 2, 'time400' => 1); 
    $racedata[] = array('horsename' => 86, 'time200' => 6, 'time400' => 6); 
    $racedata[] = array('horsename' => 67, 'time200' => 7, 'time400' => 4); 

    $array = array(); 
    foreach ($racedata as $row) 
     { 
     $array[] = $row; 
     } 

    $times = array(); 
    foreach ($array as $a) 
     { 
     $times[] = $a[$sectional]; 
     } 

    array_multisort($times, SORT_ASC, $array); 
    return $array; 
    } 

// Using $racedata to pass in the data. 
echo json_encode(sectionalrank('racedate', 'racevenue', 'time200')) . "\n"; 
echo json_encode(sectionalrank('racedate', 'racevenue', 'time400')) . "\n"; 

Output: 
[{"horsename":86,"time200":1,"time400":3},{"horsename":67,"time200":2,"time400":8},{"horsename":98,"time200":2,"time400":1},{"horsename":85,"time200":6,"time400":9},{"horsename":86,"time200":6,"time400":6},{"horsename":67,"time200":7,"time400":4}] 
[{"horsename":98,"time200":2,"time400":1},{"horsename":86,"time200":1,"time400":3},{"horsename":67,"time200":7,"time400":4},{"horsename":86,"time200":6,"time400":6},{"horsename":67,"time200":2,"time400":8},{"horsename":85,"time200":6,"time400":9}] 
+0

謝謝,我用orangepills建議在我的查詢中使用ORDER BY,但這也是一個幫助歡呼聲 –

相關問題