2017-05-16 63 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']; 
});