7
votes

Comment trier une matrice multidimensionnelle par valeur?

J'ai un tableau comme suit et je veux commander ce tableau par la valeur de la clé "Attack". Les premières clés des tableaux (15, 13, 18) code> sont identifiant de certains éléments de certains éléments de la base de données, donc je ne veux pas que ces touches soient modifiées lorsque le tableau est trié. Toute aide serait grandement appréciée.

Ceci est le tableau: p>

$data = array(
    '15' => array(
        'attack' => '45', 'defence' => '15', 'total' => '10'
    ),
    '13' => array(
        'attack' => '25', 'defence' => '15', 'total' => '10'
    ),
    '18' => array(
        'attack' => '35', 'defence' => '15', 'total' => '10'
    )
);


0 commentaires

3 Réponses :


19
votes

Utilisez uasort () code> :

Cette fonction trie un tableau de telle sorte que les indices de réseau conservent leur corrélation avec les éléments de réseau qu'ils sont associés à une fonction de comparaison définie par l'utilisateur. P>

Ceci est principalement utilisé lors du tri des tableaux associatifs où l'ordre d'élément réel est significatif. P> blockQuote>

Exemple: p> xxx pré>

si les valeurs sont toujours des chaînes, vous pouvez également utiliser strcmp () code> dans le CMP () code> Fonction: p>

return $b['attack'] - $a['attack'];


8 commentaires

Boo pour un rappel trop compliqué. $ a ['attaque'] - $ b ['attaque']; suffirait.


@salathe: True, ce serait plus efficace. Mais cela est plus conforme aux exemples de la documentation.


@Chris: uasort trie le tableau en place. Il renvoie vrai sur le succès (mentionné dans la documentation que j'ai liée à). Si vous souhaitez imprimer le résultat, vous devez imprimer le tableau.


Bien sûr, j'imprime le tableau à l'aide de print_R, mais il n'imprime que 1 à l'écran.


@Chris: Pas pour moi. Je reçois le tableau de tri ... Doit être autre chose dans votre code.


Désolé mon mauvais. J'ai vu que j'imprimais quelque chose d'autre. J'ai une autre question. Comment puis-je trier la valeur par ordre décroissant?


Merci pour toutes les réponses.


@Felix - Je suppose que les documents pourraient offrir des exemples plus variés et / ou affirmer que les valeurs ne doivent pas nécessairement être dans l'ensemble -1, 0 et 1.



4
votes

Utilisez simplement Array_Multisort

foreach ($data as $key => $row) {
    $attack[$key]  = $row['attack'];
}

// Sort the data with attack descending
array_multisort($attack, SORT_DESC, $data);


0 commentaires

0
votes
$result = [];
foreach ($data as $key => $value) {
    $result[$key] = $value;
    asort($result[$key]);
}
print_r($result);
Hope this helps !!!

0 commentaires