W3docs

Tri multidimensionnel en PHP : guide complet

Apprenez comment array_multisort() trie des tableaux parallèles et plusieurs colonnes à la fois en PHP.

array_multisort() trie un ou plusieurs tableaux simultanément. Sa véritable puissance réside dans le tri de tableaux parallèles — plusieurs tableaux représentant les colonnes d'un même ensemble de données — de sorte que lorsque vous réordonnez l'un, les autres se déplacent en synchronisation pour maintenir l'alignement des lignes correspondantes. Cette page couvre la syntaxe, les tris multi-colonnes (départage), le piège de la réindexation des clés, et comment cette fonction diffère de sort() et usort().

Syntaxe

array_multisort(
    array &$array1,
    mixed $array1_sort_order = SORT_ASC,
    mixed $array1_sort_flags  = SORT_REGULAR,
    mixed ...$rest
): bool

Les arguments sont lus par groupes : chaque tableau peut être suivi d'une constante d'ordre de tri optionnelle et d'une constante de drapeaux de tri optionnelle. La fonction trie sur place (les tableaux sont passés par référence) et renvoie true en cas de succès, false en cas d'échec.

ConstanteEffet
SORT_ASCTrier par ordre croissant (par défaut)
SORT_DESCTrier par ordre décroissant
SORT_REGULARComparer les éléments normalement (par défaut)
SORT_NUMERICComparer les éléments en tant que nombres
SORT_STRINGComparer les éléments en tant que chaînes

Tri d'un seul tableau

Dans sa forme la plus simple, elle se comporte comme sort() — elle ordonne un tableau sur place :

$data = [3, 1, 2];
array_multisort($data);
print_r($data);

Résultat :

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

Tri de tableaux parallèles (cas d'utilisation principal)

Supposons que vous ayez deux tableaux alignés par index — l'un avec des âges, l'autre avec des noms — et que vous souhaitiez trier par âge tout en maintenant chaque nom associé à son âge. Passez les deux tableaux ; le premier tableau détermine l'ordre et chaque autre tableau est réarrangé de la même façon :

$ages  = [25, 25, 30];
$names = ['John', 'Jane', 'Alice'];

array_multisort($ages, SORT_ASC, $names, SORT_ASC);

print_r($ages);
print_r($names);

Résultat :

Array
(
    [0] => 25
    [1] => 25
    [2] => 30
)
Array
(
    [0] => Jane
    [1] => John
    [2] => Alice
)

Remarquez le départage : les deux personnes de 25 ans gardent leurs positions, mais comme un second tableau ($names, SORT_ASC) a été fourni, les lignes avec des âges égaux sont ordonnées par nom — Jane avant John.

Tri selon plusieurs critères

Pour départager des égalités, listez les tableaux par ordre de priorité : le premier tableau est la clé de tri principale, le suivant départage les égalités du premier, et ainsi de suite. Chaque tableau a son propre indicateur d'ordre, vous pouvez donc mélanger des colonnes ascendantes et descendantes :

$volume  = [67, 86, 85, 98, 86, 67];
$edition = [2, 1, 6, 2, 6, 7];

// Sort by volume DESC, then by edition ASC for equal volumes.
array_multisort($volume, SORT_DESC, $edition, SORT_ASC);

print_r($volume);
print_r($edition);

Résultat :

Array
(
    [0] => 98
    [1] => 86
    [2] => 86
    [3] => 85
    [4] => 67
    [5] => 67
)
Array
(
    [0] => 2
    [1] => 1
    [2] => 6
    [3] => 6
    [4] => 2
    [5] => 7
)

Les deux 86 et les deux 67 sont regroupés, et au sein de chaque égalité les éditions sont en ordre croissant.

Tri d'un tableau de lignes par colonne

Les ensembles de données réels sont souvent un tableau de lignes associatives. Utilisez array_column() pour extraire les colonnes par lesquelles vous souhaitez trier, puis passez le tableau original en dernier afin qu'il soit réordonné en conséquence :

$rows = [
    ['name' => 'Bob',   'age' => 30],
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Carol', 'age' => 30],
];

$age  = array_column($rows, 'age');
$name = array_column($rows, 'name');

// Primary: age ASC. Tie-break: name ASC.
array_multisort($age, SORT_ASC, $name, SORT_ASC, $rows);

print_r($rows);

Résultat :

Array
(
    [0] => Array ( [name] => Alice [age] => 25 )
    [1] => Array ( [name] => Bob   [age] => 30 )
    [2] => Array ( [name] => Carol [age] => 30 )
)

Piège : les clés sont réindexées

array_multisort() réindexe les clés numériques (elles deviennent 0, 1, 2, …), mais les clés string sont préservées. Si vous avez besoin de conserver les clés entières originales, triez une copie des clés à côté des données, ou utilisez une fonction préservant les clés comme asort() à la place.

Quelle fonction de tri utiliser ?

  • Utilisez array_multisort() lorsque vous avez des tableaux parallèles ou que vous avez besoin d'un tri multi-colonnes.
  • Utilisez sort() / rsort() pour un seul tableau par valeur quand les clés n'ont pas d'importance.
  • Utilisez ksort() / asort() pour trier par clé, ou par valeur en préservant les clés.
  • Utilisez usort() lorsqu'un tableau nécessite une logique de comparaison personnalisée (par exemple, trier par longueur de chaîne, ou par une valeur dérivée) que les drapeaux ne peuvent pas exprimer.

Consultez la vue d'ensemble Tri des tableaux pour une comparaison côte à côte de toutes les fonctions de tri.

graph LR
A[Array] --> B[Array Multisort]
B --> C[Ascending/Descending Order]
B --> D[Sorting by Key]
B --> E[Sorting by Multiple Criteria]

Pratique

Pratique
Que fait la fonction array_multisort() en PHP ?
Que fait la fonction array_multisort() en PHP ?
Was this page helpful?