2013-01-14 43 views
0

我有一個PHP的遊戲中使用,用於跟蹤用戶與一個MySQL表(歷史),他們有多少次像知道了答案:如何動態定義數組索引?

username answer 
-------- ------ 
user1 answer1 
user2 answer2 
user1 answer3 

等等,我想用這個表格打印最佳球員,所以我想實現像

public function getBestPlayers($hrows) /*history_rows*/ 
{ 
$ray=array(); 
$hlen = count($hrows); 

for($i=0;$i<$hlen;$i++) 
{ 
    $curnick = $hrows[$i]['knower']; 
    $ray[$curnick]; //my attempt to "set" the index 
    if($ray[$curnick]!=NULL) 
    { 
     $ray[$curnick]++; 
    } 
    else 
    { 
     $ray[$curnick]=1; 
    } 
}//for 
$ray = sort($ray); 
return $ray; 
}//getBestPlayers() 

因此,在年底的數組我有$ray['user1'] = 2 , $ray['user2'] = 1等 但是這給錯誤「未定義指數:USER1」。 我該怎麼辦? 在此先感謝..

+0

你應該檢查索引是否通過'isset()'函數定義,然後你甚至推新的項目 – Yang

+0

謝謝。好的,我檢查並用isset()取零。那麼什麼? – marvin

回答

3

你應該讓MySQL的你這樣做,這將是更快,更容易:

SELECT username, COUNT(*) AS score FROM tbl GROUP BY username ORDER BY score DESC 

這將返回形式的結果集

username score 
-------- ------ 
user1 2 
user2 1 
+0

謝謝,但我沒有分數。我有user1的重複項,我想動態地將它變成分數,但不想存儲在mysql中。 – marvin

+0

@marvin:我知道。該查詢將自動執行此操作。你嘗試執行它嗎? – Jon

+0

OMG,這太好了!我不知道MySQL可以做到這一點。非常感謝,請原諒我的無知:) – marvin

0

您應該刪除$ray[$curnick];行,因爲您不能(也不應該)嘗試聲明這樣的數組索引。此外,您可能需要將if($ray[$curnick]!=NULL)替換爲if(isset($ray[$curnick])),它不會嘗試訪問該位置處的數組,但僅檢查它是否已設置。

除此之外,您的代碼可以工作,但是,將統計信息卸載到數據庫可能是一個好主意。