2017-05-16 4 views
2

J'ai un tableau multidimensionnel et je veux trier en fonction de la 'notation' ... mais je veux aussi que l'index commence à 1, ce qui est ce que j'ai utilisé lors de la création manuelle . Quand j'utilise usort il réarrange le tableau mais maintenant ils commencent à l'index 0 donc je ne peux pas faire une boucle de 1 - 6 parce que 6 n'est pas défini après le tri.php Trier un tableau multidimensionnel mais commencer l'index à 1

Il était plus propre de démarrer ma $ array à 1, donc $ player [$ i] représentait ce numéro de joueur. Voici ce que mon tableau ressemble avant de tri

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

Voici ma fonction de tri:

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

Et je l'appelle par

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

« Numéro du joueur » qui signifie qu'il ya une association qui devrait être conservée? C'est à dire. celui qui a la clé «1» devrait toujours avoir la clé «1» après le tri, mais cette clé peut être triée ailleurs? Dans ce cas, vous devriez utiliser 'uasort'. - Sinon, si le '1' est juste utilisé pour sortir" 1. ", vous ne devriez pas vous pencher en arrière ici; les tableaux sont indexés à zéro, période, ajoutez '+ 1' pour la sortie visuelle si nécessaire. – deceze

+0

Vous devriez probablement utiliser une boucle 'foreach()' ou démarrer votre boucle 'for()' à partir de 0. – Enstage

+0

Copie possible de [comment changer la clé du tableau pour commencer à partir de 1] (http: // stackoverflow. com/questions/5374202/how-to-change-the-array-key-to-start-from-1-from-of-0) – mickmackusa

Répondre

3

La meilleure façon est d'ajouter ce code après usort:

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

code complet:

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); 

Sortie:

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

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

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

) 

Mise à jour avec une solution posible:

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); 

Ouput:

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

J'ai essayé le array_unshit, puis désactivé et cela a résolu le problème. gentil et facile. merci – Chief

+0

@Chief, s'il vous plaît, n'oubliez pas de marquer les meilleures réponses lorsque vous recevez des réponses qui résout vos problèmes. –

+0

Si vous utilisez PHP7 +, vous pouvez utiliser le [Spaceship Operator] (http://php.net/manual/fr/migration70.new-features.php#migration70.new-features.spaceship-op) pour rationaliser le le code de comparaison renvoie l'instruction à 'return $ a ['rating'] <=> $ b ['rating'];' – fubar

1

Tout simplement annonce d, après votre usort:

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

uasort() peut être utilisé de telle sorte que le tableau conserve les clés d'origine:

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