2017-05-16 61 views
2

我有一個多維數組,我想根據'評價'排序......但我也希望索引從1開始,這是我手動創建這些時使用的。當我使用usort時,它重新排列了數組,但現在它們從索引0開始,所以我無法從1 - 6進行循環,因爲在排序後6未定義。php排序多維數組,但開始索引在1

在1位開始我的$數組更清晰,所以$ player [$ i]表示實際玩家數量。這裏是我的陣列看起來像以前那種

$player[1]['rating'] = 8 
$player[2]['rating'] = 5 
$player[3]['rating'] = 10 

這是我的排序功能:

function sortByrating($a, $b) { 
    if ($a['rating'] == $b['rating']) { 
     return 0; 
    } 
    return ($a['rating'] < $b['rating']) ? -1 : 1; 
} 

而且我通過

usort($player, 'sortByRating'); 
+0

「玩家數量」的含義有應保持關聯?即誰擁有密鑰'1'應該在排序後仍然具有密鑰'1',但該密鑰可能在其他地方被排序?在這種情況下,你應該使用'uasort'。 - 否則,如果'1'只用於輸出「1.」,則不應該在這裏向後彎曲;數組爲零索引,句點,當需要時爲視覺輸出添加'+ 1'。 – deceze

+0

可能應該使用'foreach()'循環或從0開始for()'循環。 – Enstage

+0

可能的重複[如何將數組鍵從1開始更改爲0](http:// stackoverflow。 com/questions/5374202/how-to-change-the-array-key-to-start-from-1-instead-of 0) – mickmackusa

回答

3

最簡單的方法是usort後添加以下代碼調用它:

array_unshift($player,'temp'); 
unset($player[0]); 

全碼:

function sortByrating($a, $b) { 
    return $a['rating'] - $b['rating']; 
} 

$player[1]['rating'] = 8; 
$player[2]['rating'] = 5; 
$player[3]['rating'] = 10; 

usort($player, 'sortByRating'); 

array_unshift($player,'temp'); 
unset($player[0]); 

print_r($player); 

輸出:

Array 
(
    [1] => Array 
     (
      [rating] => 5 
     ) 

    [2] => Array 
     (
      [rating] => 8 
     ) 

    [3] => Array 
     (
      [rating] => 10 
     ) 

) 

更新與更多鈔票的解決方案:

function sortByrating($a, $b) { 
    return $a['rating'] - $b['rating']; 
} 

$player[1]['rating'] = 8; 
$player[2]['rating'] = 5; 
$player[3]['rating'] = 10; 

uasort($player, 'sortByRating'); 

foreach($player as $player_id=>$player_data) { 
    $place++; 
    $player[$player_id]['place'] = $place; 
    $places[$place] = $player_id; 
    echo "Player #{$player_id} takes Place #{$place}\n"; 
} 

echo "\nPlayers array: "; 
print_r($player); 

echo "\nPlaces array: "; 
print_r($places); 

輸出繼電器:

Player #2 takes Place #1 
Player #1 takes Place #2 
Player #3 takes Place #3 

Players array: Array 
(
    [2] => Array 
     (
      [rating] => 5 
      [place] => 1 
     ) 

    [1] => Array 
     (
      [rating] => 8 
      [place] => 2 
     ) 

    [3] => Array 
     (
      [rating] => 10 
      [place] => 3 
     ) 

) 

Places array: Array 
(
    [1] => 2 
    [2] => 1 
    [3] => 3 
) 
+0

我嘗試了array_unshit,然後取消設置,並且確實解決了問題。好,易於。謝謝 – Chief

+0

@首先,當你收到解決問題的答案時,請不要忘記標記最佳答案。 –

+0

如果您使用的是PHP7 +,則可以使用[Spaceship Operator](http://php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op)來簡化比較代碼return語句到'return $ a ['rating'] <=> $ b ['rating'];' – fubar

1

只需在廣告d您usort後執行以下操作:

$player = array_combine(range(1, count($player)), $player); 

uasort()可以使用,使得陣列保持原有鍵:

uasort($player, function ($x, $y) { 
    return $x['rating'] - $y['rating']; 
});