2012-10-23 40 views
3

我也不太清楚,如果這是可能的,但我會盡量無論如何解釋,的foreach排序

我們正在試圖讓一個頁面爲我們的公會,我們希望它顯示沿着配備的物品平均等級與他們的名字,例如

Name | iLvL 
Bob 262 
Sam 159 

我們目前正在運行一個腳本,做了以下內容:

$members = $guild->getMembers(); 

這基本上得到我們的公會所有成員的名單 - 我們是那麼迭代通過與foreach循環,使另一打電話得到的信息比特

//Character Arrays 
foreach($members as $member) { 

//Get character information 
$mrank = $member['rank']; 
$mname = $member['character']['name']; 
$mgender = $member['character']['gender']; 
$mlevel = $member['character']['level']; 
$mrace = $member['character']['race']; 
$character = $armory->getCharacter($mname); 
$gear = $character->getGear(); 
$milevel = $gear['averageItemLevelEquipped']; 
echo '<td><div align="center" class="style1">'. $mname .'</div></td>'; 
echo '<td><div align="center" class="style1">'. $milevel .'</div></td> '; 

唯一的問題是因爲我們遍歷它們奇異的即時通訊也不太清楚,我怎麼能平均物品等級分類到最高到最低 - 我聽說過rsort這樣的事情,但我似乎無法讓它起作用,我想知道是否有人能夠藉此來伸出援助之手。

謝謝

+0

'$ character'從哪裏來? –

+0

$ character = $ armory-> getCharacter($ mname);這是第二次調用它來獲得關於字符的所有其他信息 –

回答

2

我建議使用每個人的子數組創建一個數組。還要創建一個僅包含averageItemLevelEquipped值的數組,然後在運行array_multisort時將其用作索引數組。這將是這個樣子:

$resourcearray = array(); 
$indexarray = array(); 

foreach($members as $member) { 
    //Get character information 
    $mrank = $member['rank']; 
    $mname = $member['character']['name']; 
    $milevel = $gear['averageItemLevelEquipped']; 
    //and anything else you want to add goes here, of course 
    array_push($resourcearray, array('rank' => $mrank, 'charname' => $mname, 'itemlevel' => $milevel)); 
    array_push($indexarray, $milevel); 
} 

array_multisort($indexarray, $resourcearray); 

foreach($resourcearray as $resource) { 
    echo '<td><div align="center" class="style1">'. $resource['charname'] .'</div></td>'; 
    echo '<td><div align="center" class="style1">'. $resource['itemlevel'] .'</div></td> '; 
} 
+0

我同意下面的人,當然,應該嘗試用SQL來解決這個問題。我想我仍然會以更嚴格的方式回答這個問題,以供參考,雖然只是一點點XY。 – Joost

2

您可以在您的SQL查詢中對成員進行排序。 如果你想排序結果數組使用uasort:http://www.php.net/manual/en/function.uasort.php

+0

然後,人們必須在SQL中加入字符和成員表 - 人們必須假定這是可能的,即他們可以訪問getCharacter的內容()函數。 – Joost

2
$members = $guild->getMembers(); 

創造另一種方法;

$members = $guild->getMembersByiLvL(); 

它將行ORDER BY iLvL DESC添加到sql查詢中。

由於您沒有顯示$ guild是一個對象的類,我不能說這麼做很容易 - 但這似乎是一個更可取的方法。

然後,您可以繼續開發的方法來做到這一點:

$members = $guild->getMembersSorted('iLvL'); 

編輯:我假設你的數據從一個MySQL數據庫來這裏,所以可能是錯誤的,當然...

2

foreach遍歷輸入數組沒有任何修改的順序。 因此您需要對foreach之前的輸入或foreach迭代的結果進行排序。

通常最好是排序的輸入之前,它是foreach版,無論是

  1. 排序當它從數據庫中抽取數據(SQL ORDER BY子句)
  2. 排序陣列(或基於陣列你想迭代

for 2,PHP中有很多數組的排序函數(看看php.net/manual/en/ref.array.php)。例如,你可以使用usort這樣的:

function cmp($a, $b) 
{ 
    if ($a['character']['level'] == $b['character']['level']) { 
    return 0; 
    } 
    return ($a['character']['level'] < $b['character']['level']) ? -1 : 1; 
} 
$members = $guild->getMembers(); 

usort($members, 'cmp'); 

foreach ($members as $member) { 
    //.. 
} 

如果你有機會到數據庫查詢,通常需要以這種方式排序的數據,它是更好的(更好的性能,更好的可讀性)使用數據庫端在SQL中排序。